建立類設計模式(5種) 工廠類相關模式

2021-09-07 09:05:33 字數 4488 閱讀 2335

想必大家一定見過類似於麥當勞自助點餐臺一類的點餐系統吧。在乙個大的觸控顯示屏上,有三類可以選擇的上餐品:漢堡等主餐、小食、飲料。當我們選擇好自己需要的食物,支付完成後,訂單就生成了。下面,我們用今天的主角--工廠模式--來生成這些食物的邏輯主體。

首先,來看主餐的生成(僅以兩種漢堡為例)。

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種設計模式,但在軟體開發中應用也較為頻繁,通常將...