標籤:順序 init 目的 %s 直接 png ali 相同 yun
說明:
假如要組裝一台電腦,將主板,CPU,記憶體等組件按照某個穩定的步驟組合,基本過程是不變的,而組成電腦的各個組件卻可以是不同效能的,不同價位,或者是不同版本的,當組成電腦的時只需要選擇不同的組件就可以按照基本相同的過程造出不同配置的電腦。也就是說建造者模式的意圖是將一個複雜物件的構建過程與表示分離,它使用相同的構建步驟作用於不同的子物件以構建出不同表現形式的“複雜物件”。
執行個體:
從訂單的角度構建一個快餐點餐系統
class Burger(): """ 主食類,價格名字 """ name="" price=0.0 def getPrice(self): return self.price def setPrice(self,price): self.price=price def getName(self): return self.nameclass cheeseBurger(Burger): """ 乳酪漢堡 """ def __init__(self): self.name="cheese burger" self.price=10.0class spicyChickenBurger(Burger): """ 香辣雞漢堡 """ def __init__(self): self.name="spicy chicken burger" self.price=15.0class 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.nameclass chips(Snack): """ 炸薯條 """ def __init__(self): self.name = "chips" self.price = 6.0class chickenWings(Snack): """ 雞翅 """ def __init__(self): self.name = "chicken wings" self.price = 12.0class 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.nameclass coke(Beverage): """ 可樂 """ def __init__(self): self.name = "coke" self.price = 4.0class milk(Beverage): """ 牛奶 """ def __init__(self): self.name = "milk" self.price = 5.0class 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())# 建造者class orderBuilder(): """ orderBuilder就是建造者模式中所謂的“建造者”, 將訂單的建造與表示相分離,以達到解耦的目的。 在上面訂單的構建過程中,如果將order直接通過參數定義好(其構建與表示沒有分離), 同時在多處進行訂單產生,此時需要修改訂單內容, 則需要一處處去修改,業務風險也就提高了不少。 """ 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)# Director類class orderDirector(): """ 在建造者模式中,還可以加一個Director類,用以安排已有模組的構造步驟。 對於在建造者中有比較嚴格的順序要求時,該類會有比較大的用處。 """ 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()#情境實現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
優點:
使得產品內部表象可以獨立的變化,使得客戶不必知道產品內部的組成細節。對構建過程更加精細控制,將構建代碼和表示代碼分開。
缺點:
難以應對”分步驟構建演算法“的需求變動。
適用性:
1、需要產生的產品有複雜的內部結構
2、需要產生的產品對象的屬性相互依賴,建造者模式可以強破產生順序。
參考連結:https://yq.aliyun.com/articles/70416?spm=a2c4e.11155435.0.0.495838daVpgS2g
python-建造者模式