想必大家一定見過類似於麥當勞自助點餐臺一類的點餐系統吧。在乙個大的觸控顯示屏上,有三類可以選擇的上餐品:漢堡等主餐、小食、飲料。當我們選擇好自己需要的食物,支付完成後,訂單就生成了。下面,我們用今天的主角--工廠模式--來生成這些食物的邏輯主體。
首先,來看主餐的生成(僅以兩種漢堡為例)。
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
以上的burger,snack,beverage,都可以認為是該快餐店的產品,由於只提供了抽象方法,我們把它們叫抽象產品類,而cheese burger等6個由抽象產品類衍生出的子類,叫作具體產品類。
接下來,「工廠」就要出現了。
class foodfactory():
type=""
def createfood(self,foodclass):
print self.type," factory produce a instance."
foodins=foodclass()
return foodins
class burge***ctory(foodfactory):
def __init__(self):
self.type="burger"
class snackfactory(foodfactory):
def __init__(self):
self.type="snack"
class beveragefactory(foodfactory):
def __init__(self):
self.type="beverage"
同樣,foodfactory為抽象的工廠類,而burge***ctory,snackfactory,beveragefactory為具體的工廠類。
在業務場景中,工廠模式是如何「生產」產品的呢?
if __name__=="__main__":
burger_factory=burge***ctory()
snack_factorry=snackfactory()
beverage_factory=beveragefactory()
cheese_burger=burger_factory.createfood(cheeseburger)
print cheese_burger.getname(),cheese_burger.getprice()
chicken_wings=snack_factorry.createfood(chickenwings)
print chicken_wings.getname(),chicken_wings.getprice()
coke_drink=beverage_factory.createfood(coke)
print coke_drink.getname(),coke_drink.getprice()
可見,業務中先生成了工廠,然後用工廠中的createfood方法和對應的引數直接生成產品例項。
列印結果如下:
burger factory produce a instance.
cheese burger 10.0
snack factory produce a instance.
chicken wings 12.0
beverage factory produce a instance.
coke 4.0
工廠模式的定義如下:定義乙個用於建立物件的介面,讓子類決定例項化哪個類。工廠方法使乙個類的例項化延遲到其子類。其通用類圖如下。其產品類定義產品的公共屬性和介面,工廠類定義產品例項化的「方式」。
在上述例子中,工廠在使用前必須例項化。如果,把工廠加個類方法,寫成如下形式:
class ******foodfactory():
@classmethod
def createfood(cls,foodclass):
print "****** factory produce a instance."
foodins = foodclass()
return foodins
在場景中寫成如下形式:
spicy_chicken_burger=******foodfactory.createfood(spicychickenburger)
這樣,省去了將工廠例項化的過程。這種模式就叫做簡單工廠模式。
還是在上述例子中,createfood方法中必須傳入foodclass才可以指定生成的food例項種類,如果,將每乙個細緻的產品都建立對應的工廠(如cheeseburger建立對應乙個cheeseburge***ctory),這樣,生成食物時,foodclass也不必指定。事實上,此時,burge***ctory就是具體食物工廠的一層抽象。這種模式,就是抽象工廠模式。
工廠模式、抽象工廠模式的優點:
1、工廠模式巨有非常好的封裝性,**結構清晰;在抽象工廠模式中,其結構還可以隨著需要進行更深或者更淺的抽象層級調整,非常靈活;
2、遮蔽產品類,使產品的被使用業務場景和產品的功能細節可以分而開發進行,是比較典型的解耦框架。
工廠模式、抽象工廠模式的使用場景:
1、當系統例項要求比較靈活和可擴充套件時,可以考慮工廠模式或者抽象工廠模式實現。比如,
在通訊系統中,高層通訊協議會很多樣化,同時,上層協議依賴於下層協議,那麼就可以對應建立對應層級的抽象工廠,根據不同的「產品需求」去生產定製的例項。
1、工廠模式相對於直接生成例項過程要複雜一些,所以,在小專案中,可以不使用工廠模式;
2、抽象工廠模式中,產品類的擴充套件比較麻煩。畢竟,每乙個工廠對應每一類產品,產品擴充套件,就意味著相應的抽象工廠也要擴充套件
設計模式 工廠類相關模式
工廠模式的定義如下 定義乙個用於建立物件的介面,讓子類決定例項化哪個類。工廠方法使乙個類的例項化延遲到其子類。其通用類圖如下。其產品類定義產品的公共屬性和介面,工廠類定義產品例項化的 方式 工廠模式 抽象工廠模式的優點 1 工廠模式巨有非常好的封裝性,結構清晰 在抽象工廠模式中,其結構還可以隨著需要...
python 設計模式之工廠類相關模式
python 工廠類設計模式 例 麥當勞自助點餐臺一類的點餐系統。在觸控顯示屏上,有三類可以選擇的餐品 漢堡,小食,飲料。當我們選擇好自己的食物,支付完成,訂單就生成了。1.漢堡以2種為例 class burger object name price 0.0 def getprice self re...
類建立型設計模式 簡單工廠模式
本文章根據劉偉 sunny 的設計模式一書記錄的筆記,感謝作者的知識分享。工廠模式是最常用的一類建立型設計模式,通常我們所說的工廠模式是指工廠方法模式,它也是使用頻率最高的工廠模式。本章將要學習的簡單工廠模式是工廠方法模式的 小弟 它不屬於gof 23種設計模式,但在軟體開發中應用也較為頻繁,通常將...