1. 程式人生 > >設計模式之工廠類模式【非原創】

設計模式之工廠類模式【非原創】

分支 難度 抽象工廠模式 並且 客戶端使用 對比 類圖 分享圖片 In

工廠模式屬於創建型設計模式,需要生成的對象叫做產品,生成對象的地 方叫做工廠。



在任何需要生成復雜對象的地方,都可以使用工廠方法模式。
---

一、簡單工廠

1.簡介

??簡單工廠模式是指專門定義一個工廠類來負責創建產品類的實例,被創建的產品通常有共同的父類。工廠類中,根據條件決定有那個具體產品類來實現。


2.角色劃分

簡單工廠一共有三種角色 分別是簡單工廠角色,抽象產品角色,具體產品角色。

簡單工廠角色:

??這是工廠模式的核心,負責生產具體的產品。
??工廠類可以被外部用戶也就是客戶端調用,創建產品對象,從而實現外部對象和產品對象的解耦合。

抽象產品角色:

??抽象工廠模式所創建的具體產品對象的父類,負責描述所有產品對象共有的特征

具體產品角色:

??是指具體的產品,客戶端調用工廠的目的就是獲取產品對象,在工廠模式中,通常擁有多個具體產品。一般來講,是抽象產品類的子類,實現了抽象產品類中定義的所有接口方法。


3.簡單工廠類圖

技術分享圖片


4.簡單工廠示例程序

class Fruit(object):  # 抽象產品角色
""" 水果基類"""
    def produce(self):
        print("Fruit is prodeced")

class Apple(Fruit):  #具體產品角色
""" 水果蘋果   """
    def produce(self):
        print("Apple is produced!"
) class Banana(Fruit): # 具體產品角色 """水果香蕉""" def produce(self): print("Banana is produced") class FruitFactory: # 簡單工廠角色 """水果工廠""" def fruit_produce(self, name): if name == "Bnanan": return Banana() else: return Fruit() if __name__ == ‘__main__‘
: factory = FruitFactory() # 生產一個蘋果 apple = factory.fruit_produce("Apple") apple.produce() # 生產一個香蕉 banana = factory.fruit_produce("Banana") banana.produce()

5. 優缺點

簡單工廠的優點

??客戶端與工廠進行交互,客戶端不在負責生產具體的產品對象,實現了解耦合

簡單工廠的缺點

??工廠類負責全部的產品的創建,當具體的產品類特別多的時候,我們需要修改工廠的代碼,從而加大了維護的難度。


二、工廠模式

1.簡介

??工廠模式基本與簡單工廠模式差不多,上面也說了,每次添加一個產品子類都必須在工廠類中添加一個判斷分支,這樣違背了開放-封閉原則,因此,工廠模式就是為了解決這個問題而產生的。


2.角色劃分

??工廠模式一共有抽象工廠角色,具體工廠角色,抽象產品角色和具體產品角色四個角色。
??相比較簡單工廠模式,工廠模式多了一個抽象工廠角色。

抽象工廠角色

??具體工廠角色必須繼承的父類,(Java中也可以通過實現接口來完成)這是工廠模式的核心。

具體工廠角色

??負責生產具體的產品。
??工廠類可以被外部用戶也就是客戶端調用,創建產品對象,從而實現外部對象和產品對象的解耦合。

抽象產品角色

??抽象工廠模式所創建的具體產品對象的父類,負責描述所有產品對象共有的特征,是具體產品的父類。

具體產品角色

??和簡單工廠中的具體產品角色一樣,是指具體的產品,客戶端調用的目的就是獲取產品的對象,工廠模式中通常有多個具體產品,一般來講是抽象產品類的子類,實現了抽象產品類中定義的所有的接口方法。


3.工廠模式類圖

技術分享圖片

4. 具體代碼示例


class Fruit(object):
    """ 水果基類 """
    def produce(self):
        print(‘Fruit is produced‘)

class Apple(Fruit):
    """ 水果蘋果    """
    def produce(self):
        print(‘Apple is produced‘)

class Banana(Fruit):
    """水果香蕉"""
    def produce(self):
        print(‘Banana is produced‘)

class FruitFactory:
    """ 水果工廠"""
    def fruit_produce(self):
        return Fruit()

class AppleFruitFactory(FruitFactory):
    """蘋果工廠"""
    def fruit_produce(self):
        return Apple()
class BananaFruitFactory(FruitFactory):
    """香蕉工廠 """
    def fruit_produce(self):
        return Banana()

if __name__ == ‘__main__‘:
 # 生產一個蘋果
    apple_factory = AppleFruitFactory()
    apple = apple_factory.fruit_produce()
    apple.produce()
    # 生產一個香蕉
    banana_factory = BananaFruitFactory()
    banana = banana_factory.fruit_produce()
    banana.produce()

5.優缺點

優點

??工廠模式不僅僅具有簡單工廠的優點,並且通過繼承自抽象工廠覺得的多個具體工廠角色來代替簡單工廠模式中的簡單工廠角色,讓工廠角色能夠細化,更容易維護
??其次,工廠模式使結構變得靈活起來,當有新的產品產生時,只要按照抽象產品角色,抽象工廠角色來生產對應的具體產品和具體的工廠,就可以被客戶端使用,而不必去修改任何已有的代碼,因此符合開閉原則,讓添加具體工廠和具體類變得十分容易,代碼也比較容易維護


三、抽象工廠模式

1.簡介

抽象工廠模式提供一系列相關或者相互依賴對象的接口而無需指定他們具體的類

與工廠模式的對比

??工廠模式針對的是一個抽象產品類,可以派生多個產品子類;而抽象工廠模式針對的是多個抽象產品類,可以派生多種產品子類。
??抽象工廠模式和工廠模式都有一個抽象工廠類,可以派生出多個具體工廠類,區別是,前者每個具體工廠只能創建一個具體產品類的實例,後者每個具體工廠類可以創建多個具體產品類的實例


2.角色劃分

抽象工廠的角色劃分與工廠模式相同


3.類圖

技術分享圖片

4.代碼示例

    class Fruit(object):
    """ 水果基類 """
    def fruit_produce(self):
        print(‘Fruit is produced‘)
    
    class Juice(object):
    """果汁基類"""
    def juice_produce(self):
        print(‘juice is produced‘)

class Apple(Fruit):
    """ 水果蘋果    """
    def fruit_produce(self):
        print(‘Apple is produced‘)

class Banana(Fruit):
    """水果香蕉"""
    def fruit_produce(self):
        print(‘Banana is produced‘)

class AppleJuice(Juice):
    ‘‘‘蘋果汁‘‘‘
    def produce(self):
        print(‘apple juice is produced‘)

class BananaJuice(Juice):
    ‘‘‘香蕉汁‘‘‘
    def produce(self):
        print(‘banana juice is produced‘)


class FruitFactory:
    """ 水果工廠"""
    def fruit_produce(self):
        return Fruit()
    
    def juice_produce(self):
        return Juice()

class AppleFruitFactory(FruitFactory):
    """蘋果工廠"""
    def fruit_produce(self):
        return Apple()
    
    def juice_produce(self):
        return AppleJuice()

class BananaFruitFactory(FruitFactory):
    """香蕉工廠 """
    def fruit_produce(self):
        return Banana()
    
    def juice_produce(self):
        return BananaJuice()

if __name__ == ‘__main__‘:
 # 生產一個蘋果
    apple_factory = AppleFruitFactory()
    apple = apple_factory.fruit_produce()
    apple.produce()

    #生產蘋果汁
    apple_factory = AppleFruitFactory()
    aj = apple_factory.juice_produce()
    aj.produce()

    # 生產一個香蕉
    banana_factory = BananaFruitFactory()
    banana = banana_factory.fruit_produce()
    banana.produce()

    # 生產香蕉汁
    banan_factory = BananaFruitFactory()
    bj = banana_factory.juice_produce()
    bj.produce()

5.優缺點

工廠方法針對的是一個產品的等級結構,而抽象方法針對的是多個產品的等級結構;

優點

抽象工廠可以使用同一工廠的等級結構來對付相同或者極為類似的產品等級結構

缺點

在增加新的產品族的時候,是支持開閉原則的。而在增加新的產品結構時(增加水果罐頭)就不支持開閉原則了

設計模式之工廠類模式【非原創】