设计模式第3篇:生成器模式(Builder)

一.生成器模式要解决的问题

  生成器模式主要解决工厂方法模式和抽象工厂模式在所创建的对象包含大量的属性时所面临的问题:

  1. 当客户端程序向工厂类传递大量参数时很容易发生错误,因为很多参数的类型有可能是相同的,并且也很难保证传递参数的顺序。
  2. 在传递参数时有些参数是可选的,但是在工厂设计模式中,所有的餐宿都必须被传递,即使可选参数也应该传递null值。
  3. 如果所要创建的对象本身很复杂,那么工厂类也会很复杂,过于复杂的程序设计不易于团队开发。

二.生成器模式的要点

  1. 首先需要在外部类中创建一个静态的生成器类,将外部类的参数(成员变量)都在生成器类中重新定义一次,这里有个命名规则,比如外部类如果为Computer,则生成器类名称为ComputerBuilder。
  2. 生成器类需要一个共有构造函数,并将必须参数作为构造函数参数传入。
  3. 生成器类需要有设置可选参数的方法,并且方法返回类型为生成器对象。
  4. 生成器类需要提供一个build()方法来返回需要创建的对象(即外部类对象)。
  5. 外部类需要一个私有构造函数,并且私有构造函数的参数类型为生成器对象。

三.附java代码如下

class Phone{
  //必须参数
private String cpu; private String memory;
  //可选参数
private boolean isRedColor; private boolean isFullScreen; public String getCpu() { return cpu; } public String getMemory() { return memory; } public boolean isRedColor() { return isRedColor; } public boolean isFullScreen() { return isFullScreen; } private Phone(PhoneBuilder phoneBuilder){ this.cpu=phoneBuilder.cpu; this.memory=phoneBuilder.memory; this.isRedColor=phoneBuilder.isRedColor; this.isFullScreen=phoneBuilder.isFullScreen; } public static class PhoneBuilder{
     //必须参数
private String cpu; private String memory;
//可选参数
private boolean isRedColor; private boolean isFullScreen; public PhoneBuilder(String cpu,String memory){ this.cpu=cpu; this.memory=memory; } public PhoneBuilder setColor(boolean redColor){ this.isRedColor=redColor; return this; } public PhoneBuilder setFullScreen(boolean fullScreen){ this.isFullScreen=fullScreen; return this; } public Phone build(){ return new Phone(this); } } }

 

与客户端程序交互代码如下:

public class TestBuilderPattern {

    public static void main(String[] args) {
        //Using builder to get the object in a single line of code and 
                //without any inconsistent state or arguments management issues        
        Phone phone = new Phone.PhoneBuilder(
                "1.5 GHz", "2 GB").setColor(true)
                .setFullScreen(true).build();
    }

}

 

posted @ 2019-01-02 23:49  曲项向天歌  阅读(178)  评论(0编辑  收藏  举报