建造者模式

建造者模式(Builder Pattern)

定義:Separate the construction of a complex object from its representation so that the same construction process can create different representations.(將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。)html

介紹

意圖:將一個複雜的構建與其表示相分離,使得一樣的構建過程能夠建立不一樣的表示。算法

主要解決:主要解決在軟件系統中,有時候面臨着"一個複雜對象"的建立工做,其一般由各個部分的子對象用必定的算法構成;因爲需求的變化,這個複雜對象的各個部分常常面臨着劇烈的變化,可是將它們組合在一塊兒的算法卻相對穩定。app

● Product產品類ide

一般是實現了模板方法模式,也就是有模板方法和基本方法,例子中的BenzModel和BMWModel就屬於產品類。測試

● Builder抽象建造者ui

規範產品的組建,通常是由子類實現。例子中的CarBuilder就屬於抽象建造者。spa

● ConcreteBuilder具體建造者code

實現抽象類定義的全部方法,而且返回一個組建好的對象。例子中的BenzBuilder和BMWBuilder就屬於具體建造者。htm

● Director導演類對象

負責安排已有模塊的順序,而後告訴Builder開始建造

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

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

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

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

關鍵代碼:建造者:建立和提供實例,導演:管理建造出來的實例的依賴關係。

應用實例: 一、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是常常變化的,生成出所謂的"套餐"。 二、JAVA 中的 StringBuilder。

優勢: 一、建造者獨立,易擴展。 二、便於控制細節風險。

缺點: 一、產品必須有共同點,範圍有限制。 二、如內部變化複雜,會有不少的建造類。

使用場景: 一、須要生成的對象具備複雜的內部結構。 二、須要生成的對象內部屬性自己相互依賴。

● 相同的方法,不一樣的執行順序,產生不一樣的事件結果時,能夠採用建造者模式。

● 多個部件或零件,均可以裝配到一個對象中,可是產生的運行結果又不相同時,則可使用該模式。

● 產品類很是複雜,或者產品類中的調用順序不一樣產生了不一樣的效能,這個時候使用建造者模式很是合適。

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

實現

步驟 1(產品角色)

/*
產品類

 */
//建造者模式
public class Product {


  private String cpu;
  private String memory;



}

步驟 2(抽象建造者(Builder))

/*
抽象建造類
 */
public  abstract   class Builder  {

    protected  Product product=new Product();

    public abstract void buildCPU();
    public Product  CreateProduct() {
        return product;
    }
}

步驟 3 ConcerteBuilder類——具體建造者類 ConcerteBuilder2類——具體建造者類(具體建造者(Concrete Builder))

/*
ConcerteBuilder類——具體建造者類
 */
public class ConcreteBuilder extends Builder {
    @Override
    public void buildCPU() {

        System.out.println("i5");
    }
}
/*
ConcerteBuilder2類——具體建造者類
 */
public class ConcreteBuilder2 extends Builder {

    @Override
    public void buildCPU() {
        System.out.println("i7");
    }
}

步驟 4(指揮者(Director))

/*
Director類——指揮者類
 */
public class Director {

    public  Product Concrete(Builder builder)
    {
        Product product;
        product=builder.CreateProduct();
        builder.buildCPU();
        return product;
    }
}

步驟 5

/*
建造者模式(Builder Pattern)
客戶端測試
 */
public class  BuilderPetternDescription {

     public static void main(String[] arg)
     {

         Director director=new Director();

         Builder builder=new ConcreteBuilder();
         Product products=director.Concrete(builder);

         Builder  builder2=new ConcreteBuilder2();
         Product product=director.Concrete(builder2);
     }
}
 
結果:

i5
i7

 

咱們假設一個快餐店的商業案例,其中,一個典型的套餐能夠是一個漢堡(Burger)和一杯冷飲(Cold drink)。漢堡(Burger)能夠是素食漢堡(Veg Burger)或雞肉漢堡(Chicken Burger),它們是包在紙盒中。冷飲(Cold drink)能夠是可口可樂(coke)或百事可樂(pepsi),它們是裝在瓶子中。

咱們將建立一個表示食物條目(好比漢堡和冷飲)的 Item 接口和實現 Item 接口的實體類,以及一個表示食物包裝的 Packing 接口和實現 Packing 接口的實體類,漢堡是包在紙盒中,冷飲是裝在瓶子中。

建造者模式與工廠模式的不一樣:

建造者模式最主要的功能是基本方法的調用順序安排,這些基本方法已經實現了,順序不一樣產生的對象也不一樣;

工廠方法則重點是建立,建立零件是它的主要職責,組裝順序則不是它關心的。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息