天天看點

深度解密Python工廠類相關模式output

  1. 認識工廠類相關模式

1 工廠類相關模式含義

工廠方法模式(英語:Factory method pattern)是一種實作了“工廠”概念的面向對象設計模式。就像其他建立型模式一樣,它也是處理在不指定對象具體類型的情況下建立對象的問題。工廠方法模式的實質是“定義一個建立對象的接口,但讓實作這個接口的類來決定執行個體化哪個類。工廠方法讓類的執行個體化推遲到子類中進行。”[1]

建立一個對象常常需要複雜的過程,是以不适合包含在一個複合對象中。建立對象可能會導緻大量的重複代碼,可能會需要複合對象通路不到的資訊,也可能提供不了足夠級别的抽象,還可能并不是複合對象概念的一部分。工廠方法模式通過定義一個單獨的建立對象的方法來解決這些問題。由子類實作這個方法來建立具體類型的對象。

對象建立中的有些過程包括決定建立哪個對象、管理對象的生命周期,以及管理特定對象的建立和銷毀的概念。

2 工廠類相關模式優點

工廠模式、抽象工廠模式的優點:

1、工廠模式巨有非常好的封裝性,代碼結構清晰;在抽象工廠模式中,其結構還可以随着需要進行更深或者更淺的抽象層級調整,非常靈活;

2、屏蔽産品類,使産品的被使用業務場景和産品的功能細節可以分而開發進行,是比較典型的解耦架構。

3 工廠類相關模式缺點

工廠模式、抽象工廠模式的缺點:

1、工廠模式相對于直接生成執行個體過程要複雜一些,是以,在小項目中,可以不使用工廠模式;

2、抽象工廠模式中,産品類的擴充比較麻煩。畢竟,每一個工廠對應每一類産品,産品擴充,就意味着相應的抽象工廠也要擴充。

4 工廠類相關模式應用

工廠模式、抽象工廠模式的使用場景:

1、當系統執行個體要求比較靈活和可擴充時,可以考慮工廠模式或者抽象工廠模式實作。比如,

在通信系統中,高層通信協定會很多樣化,同時,上層協定依賴于下層協定,那麼就可以對應建立對應層級的抽象工廠,根據不同的“産品需求”去生産定制的執行個體。

  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

  1. 總結

工廠模式也分為簡單工廠模式和抽象工廠模式,像下面這樣

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就是具體食物工廠的一層抽象。這種模式,就是抽象工廠模式。