3 Python與設計模式 建造者模式

2021-09-23 17:29:17 字數 4032 閱讀 7960

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以及 ...