0-前言

  建造者模式也是创建型模式的一种,先简单介绍下它的几部分(不画UML图,直接看代码哈):

  A、产品(Product):描述一个由一系列部件组成较为复杂的对象。

  B、抽象建造者(builder):建造者的公共接口,一般用来定义建造细节的方法,并不涉及具体的对象部件的创建。

  C、具体建造者(ConcreteBuilder):描述具体建造者,并实现抽象建造者公共接口。

  D、指挥者(Director):调用具体建造者来创建复杂对象的各个部分,并按照一定顺序来建造复杂对象。

 

1-建造者模式实现

1-1、产品(Product)

//1、产品对象(product)class Phone
{    private  String Mainboard; //主板
    private  String Screen;  //屏幕
    private  String Shell;  //外壳

    public String getMainboard()
    {        return Mainboard;
    }    public void setMainboard(String mainboard)
    {
        Mainboard = mainboard;
    }    public String getScreen()
    {        return Screen;
    }    public void setScreen(String screen)
    {
        Screen = screen;
    }    public String getShell()
    {        return Shell;
    }    public void setShell(String shell)
    {
        Shell = shell;
    }

    @Override    public String toString()
    {        return "Phone{" +
                "Mainboard='" + Mainboard + '\'' +
                ", Screen='" + Screen + '\'' +
                ", Shell='" + Shell + '\'' +
                '}';
    }

}

 

1-2、抽象建造者(builder)

//2、抽象建造者(Builder)abstract class Builder
{    abstract void bulidMainboard(); //建造主板
    abstract void bulidScreen();  //建造屏幕
    abstract void bulidShell();  //建造外壳    //完工-返回手机产品
    abstract Phone getPhone();
}

 

1-3、具体建造者(ConcreteBuilder)

//3、具体建造者class  IphoneBuilder extends Builder
{    private Phone phone;    public  IphoneBuilder()
    {
        phone = new Phone();
    }

    @Override    void bulidMainboard()
    {
        phone.setMainboard("安装了苹果手机主板!");
    }

    @Override    void bulidScreen()
    {
        phone.setScreen("安装了苹果手机的屏幕!");
    }

    @Override    void bulidShell()
    {
        phone.setShell("安装了苹果手机的外壳!");
    }

    @Override    public Phone getPhone()
    {        return phone;
    }
}

 

1-4、指挥者(Director)

//4、指挥者(Director)
 class Director
{
    //指挥工人按顺序建造手机
    public Phone create(Builder builder)
    {
        builder.bulidMainboard();
        builder.bulidScreen();
        builder.bulidShell();
        return builder.getPhone();
    }
}

1-5、客户端:

        Director director =new Director();
        Phone phone = director.create(new IphoneBuilder());
        System.out.println(phone.toString());

 

2-简单总结

优点:

1、产品的建造和表示分离,实现了解耦。

2、将复杂产品的创建步骤形成统一

3、增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。

缺点:

1、产品必须有共同点,限制了使用范围。

2、如内部变化复杂,会有很多的建造类,难以维护。

 

适用场景:

1、需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;

2、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

3、需要生成的对象内部属性本身相互依赖。

4、适合于一个具有较多的零件(属性)的产品(对象)的创建过程。