主要作用:在使用者不知道物件的建造過程和細節的情況下就可以直接建立複雜的物件。
使用者只需要給出指定複雜物件的型別和內容,建造者模式負責按順序建立複雜物件(把內部的建造過程和細節隱藏起來)
例子:
角色分析:
建圖紙(記錄建房的方法,步驟):
//抽象的建造者:方法
public
abstract
class
builder
建立產品類:
需要哪些零件才能建成房子。
//房子
public
class
product
public
void
setbuildera
(string buildera)
public string getbuilderb()
public
void
setbuilderb
(string builderb)
public string getbuilderc()
public
void
setbuilderc
(string builderc)
public string getbuilderd()
public
void
setbuilderd
(string builderd)
@override
public string tostring()
';}}
建工人類(實現圖紙的方法,並建出房子):
public
class
worker
extends
builder
@override
void
buildera()
@override
void
builderb()
@override
void
builderc()
@override
void
builderd()
@override
product getproduct()
}
建指揮者類(指揮工人按照什麼樣的施工順序幹活,並通過工人得到房子)
//指揮者
public
class
director
}
測試類:
下面進行改造,取消指揮者角色,把選擇權交給使用者,使用者可以選擇產品的建造順序,如果不想自己指揮順序,則可以擁有預設的產品建造策略。
示例(麥當勞點餐):
解析:顧客可以選擇自己組合快餐,也可以直接買預設的**。
建抽象的建造者類:
//抽象的建造者
public
abstract
class
builder
建產品類(每乙個屬性被固定的賦值,即為預設的**):
//產品
public
class
product
public
void
setbuildera
(string buildera)
public string getbuilderb()
public
void
setbuilderb
(string builderb)
public string getbuilderc()
public
void
setbuilderc
(string builderc)
public string getbuilderd()
public
void
setbuilderd
(string builderd)
@override
public string tostring()
';}}
建具體的建造者:
public
class
worker
extends
builder
@override
builder buildera
(string msg)
@override
builder builderb
(string msg)
@override
builder builderc
(string msg)
@override
builder builderd
(string msg)
@override
product getproduct()
}
測試類:
其中,顧客可以直接選擇set方法賦值指定自己想要吃的食品。
如果不想指定,可以直接獲取產品,即預設**。
缺點:
23種設計模式之建造者模式
建造模式的本質 分離了物件子元件的單獨構造 有builder來負責 和裝配 由diretor負責 從而可以構造出複雜的物件。這種模式適用於 某個物件的構建過程複雜的情況下使用。由於實現了構建和裝配的解耦。不同的構建器,相同的裝配,也可以做出不同的物件 相同的構建器,不同的裝配順序也可以做出不同的物件...
23種設計模式之建造者模式
建造者模式也叫生成器模式,定義如下 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示 類圖如下 在建造者模式中,四個角色如下 product 產品類 通常是實現了模板方法模式,也就是有模板方法和基本方法 builder 抽象建造者 規範產品的組建,一般是由子類實現 concr...
23種設計模式之 建造者模式
又是乙個週三,快要下班了,老大突然拉住我,喜滋滋的告訴我 xx公司很滿意我們做的模型,又簽訂了乙個合同,把賓士 寶馬的車輛模型都交給我們公司製作了,不過這次又額外增加了乙個需求 汽車的啟動 停止 喇叭聲音 引擎聲音都由客戶自己控制,他想什麼順序就什麼順序,這個沒問題吧?又是乙個時間緊,工程量大的專案...