1. 程式人生 > 實用技巧 >無廢話設計模式(3)建造者模式

無廢話設計模式(3)建造者模式

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、適合於一個具有較多的零件(屬性)的產品(物件)的建立過程。