class burger():
name=""
price=0.0
def getprice(self):
return self.price
def setprice(self,price):
self.price=price
def getname(self):
return self.name
class cheeseburger(burger):
def __init__(self):
self.name="cheese burger"
self.price=10.0
class spicychickenburger(burger):
def __init__(self):
self.name="spicy chicken burger"
self.price=15.0
小食:
class snack():
name = ""
price = 0.0
type = "snack"
def getprice(self):
return self.price
def setprice(self, price):
self.price = price
def getname(self):
return self.name
class chips(snack):
def __init__(self):
self.name = "chips"
self.price = 6.0
class chickenwings(snack):
def __init__(self):
self.name = "chicken wings"
self.price = 12.0
飲料:
class beverage():
name = ""
price = 0.0
type = "beverage"
def getprice(self):
return self.price
def setprice(self, price):
self.price = price
def getname(self):
return self.name
class coke(beverage):
def __init__(self):
self.name = "coke"
self.price = 4.0
class milk(beverage):
def __init__(self):
self.name = "milk"
self.price = 5.0
最終,我們是要建造乙個訂單,因而,需要乙個訂單類。假設,乙個訂單,包括乙份主食,乙份小食,一種飲料。(省去一些異常判斷)
class order():
burger=""
snack=""
beverage=""
def __init__(self,orderbuilder):
self.burger=orderbuilder.bburger
self.snack=orderbuilder.bsnack
self.beverage=orderbuilder.bbeverage
def show(self):
print "burger:%s"%self.burger.getname()
print "snack:%s"%self.snack.getname()
print "beverage:%s"%self.beverage.getname()
**中的orderbuilder是什麼鬼?這個orderbuilder就是建造者模式中所謂的「建造者」了,先不要問為什麼不在order類中把所有內容都填上,而非要用builder去建立。接著往下看。
orderbuilder的實現如下:
class orderbuilder():
bburger=""
bsnack=""
bbeverage=""
def addburger(self,xburger):
self.bburger=xburger
def addsnack(self,xsnack):
self.bsnack=xsnack
def addbeverage(self,xbeverage):
self.bbeverage=xbeverage
def build(self):
return order(self)
在場景中如下去實現訂單的生成:
if __name__=="__main__":
order_builder=orderbuilder()
order_builder.addburger(spicychickenburger())
order_builder.addsnack(chips())
order_builder.addbeverage(milk())
order_1=order_builder.build()
order_1.show()
列印結果如下:
burger:spicy chicken burger
snack:chips
beverage:milk
建造者模式的定義如下:將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
建造者模式的作用,就是將「構建」和「表示」分離,以達到解耦的作用。在上面訂單的構建過程中,如果將order直接通過引數定義好(其構建與表示沒有分離),同時在多處進行訂單生成,此時需要修改訂單內容,則需要一處處去修改,業務風險也就提高了不少。
在建造者模式中,還可以加乙個director類,用以安排已有模組的構造步驟。對於在建造者中有比較嚴格的順序要求時,該類會有比較大的用處。在上述例子中,director實現如下:
class orderdirector():
order_builder=""
def __init__(self,order_builder):
self.order_builder=order_builder
def createorder(self,burger,snack,beverage):
self.order_builder.addburger(burger)
self.order_builder.addsnack(snack)
self.order_builder.addbeverage(beverage)
return self.order_builder.build()
通過createorder直接代入引數,即可直接生成訂單。
優點:1、封裝性好,使用者可以不知道物件的內部構造和細節,就可以直接建造物件;
2、系統擴充套件容易;
3、建造者模式易於使用,非常靈活。在構造性的場景中很容易實現「流水線」;
4、便於控制細節。
使用場景:
1、目標物件由元件構成的場景中,很適合建造者模式。例如,在一款賽車遊戲中,車輛生成時,需要根據級別、環境等,選擇輪胎、懸掛、骨架等部件,構造一輛「賽車」;
2、在具體的場景中,物件內部介面需要根據不同的引數而呼叫順序有所不同時,可以使用建造者模式。例如:乙個植物養殖器系統,對於某些不同的植物,澆水、施加肥料的順序要求可能會不同,因而可以在director中維護乙個類似於佇列的結構,在例項化時作為引數代入到具體建造者中。
1、「加工工藝」對使用者不透明。(封裝的兩面性)
設計模式(3) 建造者模式
建造者模式 builder pattern 將乙個複雜物件的構建與它的表示分離,使的同樣的構建過程可以建立不同的表示。建造者模式的本質是使組裝過程 用指揮者類進行封裝,從而達到解耦的目的 和建立具體產品解耦,使我們不用去關心每個元件是如何組裝的。在軟體系統中,有時需要建立乙個複雜物件,並且這個複雜物...
Python設計模式 建造者模式
需求,畫人物,要求畫乙個人的頭,左手,右手,左腳,右腳和身體,畫乙個瘦子,乙個胖子 不使用設計模式 encoding utf 8 author kevinlu1010 qq.com if name name print 畫左手 print 畫右手 print 畫左腳 print 畫右腳 print ...
python設計模式 建造者模式
一 什麼是建造者模式我們想要建立乙個由多個部分構成的物件,而且它的構成需要一步接一步地完成。只有當各個部分都建立好,這個物件才算是完整的。這正是建造者設計模式。二 工廠模式和建造者模式的區別 三 應用案例引入了乙個建造者computerbuilder 乙個指揮者hardwareengineer以及 ...