天天看點

23種設計模式——建造者模式(Bulider模式)

建造者模式(Builder Pattern)使用多個簡單的對象一步一步建構成一個複雜的對象。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。

一個 Builder 類會一步一步構造最終的對象。該 Builder 類是獨立于其他對象的。

介紹

意圖:将一個複雜的建構與其表示相分離,使得同樣的建構過程可以建立不同的表示。

主要解決:主要解決在軟體系統中,有時候面臨着"一個複雜對象"的建立工作,其通常由各個部分的子對象用一定的算法構成;由于需求的變化,這個複雜對象的各個部分經常面臨着劇烈的變化,但是将它們組合在一起的算法卻相對穩定。

何時使用:一些基本部件不會變,而其組合經常變化的時候。

如何解決:将變與不變分離開。

關鍵代碼:建造者:建立和提供執行個體,導演:管理建造出來的執行個體的依賴關系。

應用執行個體: 1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐"。 2、JAVA 中的 StringBuilder。

優點: 1、建造者獨立,易擴充。 2、便于控制細節風險。

缺點: 1、産品必須有共同點,範圍有限制。 2、如内部變化複雜,會有很多的建造類。

使用場景: 1、需要生成的對象具有複雜的内部結構。 2、需要生成的對象内部屬性本身互相依賴。

注意事項:與工廠模式的差別是:建造者模式更加關注與零件裝配的順序。

模式的結構與實作

建造者(Builder)模式由産品、抽象建造者、具體建造者、指揮者等 4 個要素構成,現在我們來分析其基本結構和實作方法。

1. 模式的結構

建造者(Builder)模式的主要角色如下。

  1. 産品角色(Product):它是包含多個組成部件的複雜對象,由具體建造者來建立其各個零部件。
  2. 抽象建造者(Builder):它是一個包含建立産品各個子部件的抽象方法的接口,通常還包含一個傳回複雜産品的方法 getResult()。
  3. 具體建造者(Concrete Builder):實作 Builder 接口,完成複雜産品的各個部件的具體建立方法。
  4. 指揮者(Director):它調用建造者對象中的部件構造與裝配方法完成複雜對象的建立,在指揮者中不涉及具體産品的資訊。

其結構圖如圖 1 所示。

23種設計模式——建造者模式(Bulider模式)

                        圖1 建造者模式的結構圖

2. 模式的實作

圖 1 給出了建造者(Builder)模式的主要結構,其相關類的代碼如下。

(1) 産品角色:包含多個組成部件的複雜對象。

class Product {
    private String partA;
    private String partB;
    private String partC;
    public void setPartA(String partA) {
        this.partA = partA;
    }
    public void setPartB(String partB) {
        this.partB = partB;
    }
    public void setPartC(String partC) {
        this.partC = partC;
    }
    public void show() {
        //顯示産品的特性
    }
}
           

(2) 抽象建造者:包含建立産品各個子部件的抽象方法。

abstract class Builder {
    //建立産品對象
    protected Product product = new Product();
    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract void buildPartC();
    //傳回産品對象
    public Product getResult() {
        return product;
    }
}
           

(3) 具體建造者:實作了抽象建造者接口。

public class ConcreteBuilder extends Builder {
    public void buildPartA() {
        product.setPartA("建造 PartA");
    }
    public void buildPartB() {
        product.setPartB("建造 PartB");
    }
    public void buildPartC() {
        product.setPartC("建造 PartC");
    }
}
           

(4) 指揮者:調用建造者中的方法完成複雜對象的建立。

class Director {
    private Builder builder;
    public Director(Builder builder) {
        this.builder = builder;
    }
    //産品建構與組裝方法
    public Product construct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
        return builder.getResult();
    }
}
           

(5) 客戶類。

public class Client {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        Product product = director.construct();
        product.show();
    }
}
           

轉載:http://c.biancheng.net/view/1354.html