建造者模式(Builder Pattern)
定義:Separate the construction of a complex object from its representation so that the same construction process can create different representations.(將一個復雜物件的構建與它的表示分離,使得同樣的構建程序可以創建不同的表示,)
介紹
意圖:將一個復雜的構建與其表示相分離,使得同樣的構建程序可以創建不同的表示,
主要解決:主要解決在軟體系統中,有時候面臨著"一個復雜物件"的創建作業,其通常由各個部分的子物件用一定的演算法構成;由于需求的變化,這個復雜物件的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法卻相對穩定,
● Product產品類
通常是實作了模板方法模式,也就是有模板方法和基本方法,例子中的BenzModel和BMWModel就屬于產品類,
● Builder抽象建造者
規范產品的組建,一般是由子類實作,例子中的CarBuilder就屬于抽象建造者,
● ConcreteBuilder具體建造者
實作抽象類定義的所有方法,并且回傳一個組建好的物件,例子中的BenzBuilder和BMWBuilder就屬于具體建造者,
● Director導演類
負責安排已有模塊的順序,然后告訴Builder開始建造
建造者(Builder)模式的主要角色如下,
- 產品角色(Product):它是包含多個組成部件的復雜物件,由具體建造者來創建其各個滅部件,
- 抽象建造者(Builder):它是一個包含創建產品各個子部件的抽象方法的介面,通常還包含一個回傳復雜產品的方法 getResult(),
- 具體建造者(Concrete Builder):實作 Builder 介面,完成復雜產品的各個部件的具體創建方法,
- 指揮者(Director):它呼叫建造者物件中的部件構造與裝配方法完成復雜物件的創建,在指揮者中不涉及具體產品的資訊,
何時使用:一些基本部件不會變,而其組合經常變化的時候,
如何解決:將變與不變分離開,
關鍵代碼:建造者:創建和提供實體,導演:管理建造出來的實體的依賴關系,
應用實體: 1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐", 2、JAVA 中的 StringBuilder,
優點: 1、建造者獨立,易擴展, 2、便于控制細節風險,
缺點: 1、產品必須有共同點,范圍有限制, 2、如內部變化復雜,會有很多的建造類,
使用場景: 1、需要生成的物件具有復雜的內部結構, 2、需要生成的物件內部屬性本身相互依賴,
● 相同的方法,不同的執行順序,產生不同的事件結果時,可以采用建造者模式,
● 多個部件或零件,都可以裝配到一個物件中,但是產生的運行結果又不相同時,則可以使用該模式,
● 產品類非常復雜,或者產品類中的呼叫順序不同產生了不同的效能,這個時候使用建造者模式非常合適,
注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序,
實作
步驟 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 介面的物體類,漢堡是包在紙盒中,冷飲是裝在瓶子中,
建造者模式與工廠模式的不同:
建造者模式最主要的功能是基本方法的呼叫順序安排,這些基本方法已經實作了,順序不同產生的物件也不同;
工廠方法則重點是創建,創建零件是它的主要職責,組裝順序則不是它關心的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/6009.html
標籤:設計模式
上一篇:迭代器模式
下一篇:軟體設計模式修煉 -- 策略模式
