- 認識工廠類相關模式
1 工廠類相關模式含義
工廠方法模式(英語:Factory method pattern)是一種實作了“工廠”概念的面向對象設計模式。就像其他建立型模式一樣,它也是處理在不指定對象具體類型的情況下建立對象的問題。工廠方法模式的實質是“定義一個建立對象的接口,但讓實作這個接口的類來決定執行個體化哪個類。工廠方法讓類的執行個體化推遲到子類中進行。”[1]
建立一個對象常常需要複雜的過程,是以不适合包含在一個複合對象中。建立對象可能會導緻大量的重複代碼,可能會需要複合對象通路不到的資訊,也可能提供不了足夠級别的抽象,還可能并不是複合對象概念的一部分。工廠方法模式通過定義一個單獨的建立對象的方法來解決這些問題。由子類實作這個方法來建立具體類型的對象。
對象建立中的有些過程包括決定建立哪個對象、管理對象的生命周期,以及管理特定對象的建立和銷毀的概念。
2 工廠類相關模式優點
工廠模式、抽象工廠模式的優點:
1、工廠模式巨有非常好的封裝性,代碼結構清晰;在抽象工廠模式中,其結構還可以随着需要進行更深或者更淺的抽象層級調整,非常靈活;
2、屏蔽産品類,使産品的被使用業務場景和産品的功能細節可以分而開發進行,是比較典型的解耦架構。
3 工廠類相關模式缺點
工廠模式、抽象工廠模式的缺點:
1、工廠模式相對于直接生成執行個體過程要複雜一些,是以,在小項目中,可以不使用工廠模式;
2、抽象工廠模式中,産品類的擴充比較麻煩。畢竟,每一個工廠對應每一類産品,産品擴充,就意味着相應的抽象工廠也要擴充。
4 工廠類相關模式應用
工廠模式、抽象工廠模式的使用場景:
1、當系統執行個體要求比較靈活和可擴充時,可以考慮工廠模式或者抽象工廠模式實作。比如,
在通信系統中,高層通信協定會很多樣化,同時,上層協定依賴于下層協定,那麼就可以對應建立對應層級的抽象工廠,根據不同的“産品需求”去生産定制的執行個體。
- Python實作工廠類相關模式
1 執行個體分析
2.1 執行個體分析
工廠類相關的模式在Python裡面沒有特别的實作方法,我們就直接用案例來分析。
2.1.1 背景要求
假設我們現在需要開發一個快餐點餐系統,想必大家一定見過類似于麥當勞自助點餐台一類的點餐系統吧。在一個大的觸摸顯示屏上,有三類可以選擇的上餐品:漢堡等主餐、小食、飲料。當我們選擇好自己需要的食物,支付完成後,訂單就生成了。下面,我們用今天的主角--工廠模式--來生成這些食物的邏輯主體。
2.1.2 主餐的生成(僅以兩種漢堡為例)
@dataclass
class Burger:
name: str = ""
price: float = 0.0
def getPrice(self) -> float:
return self.price
def setPrice(self, price) -> NoReturn:
self.price = price
def getName(self) -> str:
return self.name
class cheeseBurger(Burger):
name = "cheese burger"
price = 10.0
class spicyChickenBurger(Burger):
name = "spicy chicken burger"
price = 15.0
2.1.3 小食生成
class Snack:
name: str = ""
price: float = 0.0
type: str = "SNACK"
def getPrice(self) -> float:
return self.price
def setPrice(self, price) -> NoReturn:
self.price = price
def getName(self) -> str:
return self.name
class chips(Snack):
name = "chips"
price = 6.0
class chickenWings(Snack):
name = "chicken wings"
price = 12.0
2.1.4 飲料生成
class Beverage:
name: str = ""
price: float = 0.0
type: str = "BEVERAGE"
def getPrice(self) -> float:
return self.price
def setPrice(self, price) -> NoReturn:
self.price = price
def getName(self) -> str:
return self.name
class coke(Beverage):
name = "coke"
price = 4.0
class milk(Beverage):
name = "milk"
price = 5.0
2.1.5 實作工廠類
以上的Burger,Snack,Beverage,都可以認為是該快餐店的産品,由于隻提供了抽象方法,我們把它們叫抽象産品類,而cheese burger等6個由抽象産品類衍生出的子類,叫作具體産品類。
接下來,“工廠”就要出現了。
class foodFactory:
type: str = ""
def createFood(self, foodClass) -> ClassVar:
print(self.type, " factory produce a instance.")
foodIns = foodClass()
return foodIns
class burgerFactory(foodFactory):
type = "BURGER"
class snackFactory(foodFactory):
type = "SNACK"
class beverageFactory(foodFactory):
type = "BEVERAGE"
2.1.6 開始生産
同樣,foodFactory為抽象的工廠類,而burgerFactory,snackFactory,beverageFactory為具體的工廠類。
在業務場景中,工廠模式是如何“生産”産品的呢?
if __name__=="__main__":
burger_factory=burgerFactory()
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()
output
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 simpleFoodFactory:
@classmethod
def createFood(cls,foodClass):
print "Simple factory produce a instance."
foodIns = foodClass()
return foodIns
在場景中寫成如下形式:
spicy_chicken_burger=simpleFoodFactory.createFood(spicyChickenBurger)
這樣,省去了将工廠執行個體化的過程。這種模式就叫做簡單工廠模式。
還是在上述例子中,createFood方法中必須傳入foodClass才可以指定生成的food執行個體種類,如果,将每一個細緻的産品都建立對應的工廠(如cheeseBurger建立對應一個cheeseBurgerFactory),這樣,生成食物時,foodClass也不必指定。事實上,此時,burgerFactory就是具體食物工廠的一層抽象。這種模式,就是抽象工廠模式。