建造者模式(builder pattern)又稱生成器模式:將乙個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。
這個 builder,其實和模板模式非常的像,但是也有區別,那就是在模板模式中父類對子類中的實現進行操作,在父類之中進行一件事情的處理,但是在 builder 模式之中,父類和子類都不用關心怎麼處理,而是用另乙個類來完成對這些方法的有機組合,這個類的職責就是監工,規定了到底要怎麼樣有機的組合這些方法。在監工類(director)中,將父類組合進去,然後呼叫父類的操作來抽象的實現一件事情,這就是面向介面(抽象)變成的妙處了,當然這個 builder 可以使介面也可以是抽象類,在這裡我們使用抽象類。
三個角色:建造者、具體的建造者、監工、使用者(嚴格來說不算)
注意:定義中「將乙個複雜的構建過程與其表示相分離」,表示並不是由建造者負責一切,而是由監工負責控制(定義)乙個複雜的構建過程,由各個不同的建造者分別負責實現構建過程中所用到的所有構建步驟。不然,就無法做到「使得同樣的構建過程可以建立不同的表示」這一目標。
第一步、建立構建者介面或者抽象類
package builder.demo.build;
/*** 建造者抽象類也可以是介面
*/public abstract class builder
}
第二部、建立具體的構建者
package builder.demo.build;
/*** 具體建造者1
*/public class concretebuilder1 extends builder
@override
public void buildpart2()
@override
public void buildpart3()
}
package builder.demo.build;
/** * 具體建造者2
*/public class concretebuilder2 extends builder
@override
public void buildpart2()
@override
public void buildpart3()
}
第三步、建立建工,它包含了構建者,並且控制構建過程
package builder.demo.director;
import builder.demo.build.builder;
/** * 監工
* 將乙個複雜的構建過程與其表示相分離
*/public class director
/*** 監工開始定義和控制構建的具體過程
*/public void construct()
builder.buildpart3();}}
第四步、測試
package builder.demo;
import builder.demo.build.builder;
import builder.demo.build.concretebuilder1;
import builder.demo.build.concretebuilder2;
import builder.demo.director.director;
public class client
}
the result is :
builder1 : part1
builder1 : part2
builder1 : part2
builder1 : part2
builder1 : part2
builder1 : part2
builder1 : part3
the result is :
builder2 : part1
builder2 : part2
builder2 : part2
builder2 : part2
builder2 : part2
builder2 : part2
builder2 : part3
建立型 建造者模式
使用建立物件時,需要對建立例項物件的屬性進行校驗,屬性之間有一定關聯 或者需要建立的必要引數比較多,直接寫在建構函式比較難看,而直接用set又無法保證能確確實實被例項化。例 需要定義乙個執行緒池,執行緒池包括以下配置屬性 執行緒池大小 執行緒池最大空閒例項 執行緒池最小空閒例項 這幾個屬性之間存在關...
建立型設計模式 建造者模式
建造者模式的結構 產品角色 抽象建造者 具體建造者 指揮者。相比抽象工廠模式,省掉了抽象產品,多了指揮者。產品class product 抽象建造者 abstract class builder 具體建造者 public class concretebuilder extends builder p...
設計模式 建立型 建造者模式
生產乙個遊戲玩家,遊戲玩家由臉 身體 腿 胳膊組成,組裝時有順序要求 from abc import abcmeta,abstractmethod 產品 class player def init self,face none body none arm none leg none self.fac...