天天看點

Java設計模式_建造者模式

轉自:http://www.runoob.com/design-pattern/builder-pattern.html

建造者(Builder Pattern)模式屬于對象的建立模式,可以分布建構對象,将一個對象的屬性與對象的建立周期分割開來,進而在建立過程中生成具有不同屬性的對象。

介紹

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

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

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

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

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

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

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

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

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

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

三個角色:建造者、具體的建造者、監工、使用者(嚴格來說不算)

  •  建造者角色:定義生成執行個體所需要的所有方法;
  •  具體的建造者角色:實作生成執行個體所需要的所有方法,并且定義擷取最終生成執行個體的方法;
  •  監工角色:定義使用建造者角色中的方法來生成執行個體的方法;
  •  使用者:使用建造者模式。

建造者角色:

package com.wlz;

/**
 * @author zhiqiang zhang
 * @create 2019-02-15-12:49
 **/
public abstract class Builder {
    public abstract void buildPart1();
    public abstract void buildPart2();
    public abstract void buildPart3();
}
           

監工角色:

package com.wlz;

/** 監工角色
 * @author zhiqiang zhang
 * @create 2019-02-15-12:53
 **/
public class Director {
    //對象屬性
    private Builder builder;
    //構造器
    public Director(Builder builder){
        this.builder=builder;
    }

    public Builder getBuilder() {
        return builder;
    }

    public void setBuilder(Builder builder) {
        this.builder = builder;
    }

    //定義一個建構過程
    public void construct(){
        builder.buildPart1();
        for(int i=0;i<5;i++){
            builder.buildPart2();
        }
        builder.buildPart3();
    }
}
           

具體建造者:

package com.wlz;

/** 具體的建造者角色
 * @author zhiqiang zhang
 * @create 2019-02-15-13:06
 **/
public class ConcreteBuilder1 extends Builder {

    @Override
    public void buildPart1() {
        System.out.println("構模組化塊一");
    }

    @Override
    public void buildPart2() {
        System.out.println("構模組化塊二");
    }

    @Override
    public void buildPart3() {
        System.out.println("構模組化塊三");
    }
}
           

測試:

public static void TestBuilder(){
        //建造者
        ConcreteBuilder1 concreteBuilder1=new ConcreteBuilder1();
        //監工
        Director director=new Director(concreteBuilder1);
        //建造執行個體
        director.construct();
    }
           

運作結果:

構模組化塊一
構模組化塊二
構模組化塊二
構模組化塊二
構模組化塊二
構模組化塊二
構模組化塊三
           

擴充

建造者模式的簡化:

  • 省略抽象建造者角色:如果系統中隻需要一個具體建造者的話,可以省略掉抽象建造者。
  • 省略指揮者角色:在具體建造者隻有一個的情況下,如果抽象建造者角色已經被省略掉,那麼還可以省略指揮者角色,讓

Builder角色扮演指揮者與建造者雙重角色。

建造者模式與抽象工廠模式的比較:

  • 與抽象工廠模式相比, 建造者模式傳回一個組裝好的完整産品,而 抽象工廠模式傳回一系列相關的産品,這些産品位于不同的産品等級結構,構成了一個産品族。
  • 在抽象工廠模式中,用戶端執行個體化工廠類,然後調用工廠方法擷取所需産品對象,而在建造者模式中,用戶端可以不直接調用建造者的相關方法,而是通過指揮者類來指導如何生成對象,包括對象的組裝過程和建造步驟,它側重于一步步構造一個複雜對象,傳回一個完整的對象。
  • 如果将抽象工廠模式看成 汽車配件生産工廠 ,生産一個産品族的産品,那麼建造者模式就是一個 汽車組裝工廠 ,通過對部件的組裝可以傳回一輛完整的汽車。

繼續閱讀