python-工廠方法模式


源碼地址:https://github.com/weilanhanf/PythonDesignPatterns

簡單工廠模式的不足:

在簡單工廠模式中,只提供了一個工廠類,該工廠類處於對產品類進行實例化的中心位置,它知道每一個產品對象的創建細節,並決定何時實例化哪一個產品類。簡單工廠模式最大的缺點是當有新產品要加入到系統中時,必須修改工廠類,加入必要的處理邏輯,這違背了“開閉原則”。在簡單工廠模式中,所有的產品都是由同一個工廠創建,工廠類職責較重,業務邏輯較為復雜,具體產品與工廠類之間的耦合度高,嚴重影響了系統的靈活性和擴展性,而工廠方法模式則可以很好地解決這一問題。

說明:

工廠方法模式:

定義一個用於創建對象的接口,但是讓子類決定將哪一個類實例化。工廠方法模式讓一個類的實例化延遲到其子類。

工廠方法模式就是簡單工廠模式的進一步抽像。由於面向對象多態性,工廠方法模式保持了簡單工廠的有點同時克服了他的缺點。工廠方法模式中,核心的工廠被提升為一個抽象類,將具體的創建工作交給他的子類完成。這個抽象的工廠類僅規定具體工廠實現的接口,而不明確指出如何實例化一個產品類,這使得工廠方法模式允許系統在不修改原有產品結構的情況下輕松的引進新產品。

抽象工廠模式:

提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。

抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形式。當系統所提供的工廠生產的具體產品並不是一個簡單的對象,而是多個位於不同產品等級結構、屬於不同類型的具體產品時就可以使用抽象工廠模式 ,抽象工廠模式中的具體工廠不只是創建一種產品,它負責創建一族產品 當一個工廠等級結構可以創建出分屬於不同產品等級結構的一個產品族中的所有對象時,抽象工廠模式比工廠方法模式更為簡單、更有效率

抽象工廠模式包含以下4個角色: AbstractFactory(抽象工廠) ConcreteFactory(具體工廠) AbstractProduct(抽象產品) ConcreteProduct(具體產品)

 

 

實例:

某快餐點餐台的點餐系統。在一個大的觸摸顯示屏上,有三類可以選擇的上餐品:漢堡等主餐、小食、飲料。當我們選擇好自己需要的食物,支付完成后,訂單就生成了。

 

class Burger():
    """
    漢堡
    """
    name=""
    price=0.0
    type='BURGER'
    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(): """ 抽象工廠foodFactory為抽象的工廠類,而burgerFactory,snackFactory,beverageFactory為具體的工廠類。 """ type="" def createFood(self,foodClass): print(self.type," factory produce a instance.") foodIns=foodClass() return foodIns class BurgerFactory(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" if __name__=="__main__": burger_factory=burgerFactory() snack_factory=snackFactory() beverage_factory=beverageFactory() cheese_burger=burger_factory.createFood(cheeseBurger) print(cheese_burger.getName(),cheese_burger.getPrice()) chicken_wings=snack_factory.createFood(chickenWings) print(chicken_wings.getName(),chicken_wings.getPrice()) coke_drink=beverage_factory.createFood(coke) print(coke_drink.getName(),coke_drink.getPrice())

打印結果:

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

在實例中,抽象工廠下共有三個具體工廠burgerFactory,snackFactory,beverageFactory,三個工廠分別對應,換言之就是生產三類產品burger,snack,beverage。

工廠方法模式

模式優點

工廠方法用來創建客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被實例化這一細節 能夠讓工廠自主確定創建何種產品對象,而如何創建這個對象的細節則完全封裝在具體工廠內部 在系統中加入新產品時,完全符合開閉原則

模式缺點

系統中類的個數將成對增加,在一定程度上增加了系統的復雜度,會給系統帶來一些額外的開銷 增加了系統的抽象性和理解難度

模式適用環境

客戶端不知道它所需要的對象的類(客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體產品對象由具體工廠類創建) 抽象工廠類通過其子類來指定創建哪個對象

抽象工廠模式:

模式優點

隔離了具體類的生成,使得客戶端並不需要知道什么被創建 當一個產品族中的多個對象被設計成一起工作時,它能夠保證客戶端始終只使用同一個產品族中的對象 增加新的產品族很方便,無須修改已有系統,符合開閉原則

模式缺點

增加新的產品等級結構麻煩,需要對原有系統進行較大的修改,甚至需要修改抽象層代碼,這顯然會帶來較大的不便,違背了開閉原則

模式適用環境

一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節 系統中有多於一個的產品族,但每次只使用其中某一產品族 屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來 產品等級結構穩定,設計完成之后,不會向系統中增加新的產品等級結構或者刪除已有的產品等級結構


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM