5.設計模式之三:工廠方法模式【建立型模式】

在現實生活中社會分工愈來愈細,愈來愈專業化。各類產品有專門的工廠生產,完全告別了自給自足的小農經濟時代,這大大縮短了產品的生產週期,提升了生產效率。python

一樣,在軟件開發中可否作到軟件對象的生產和使用相分離呢?設計模式

定義與特色

工廠方法(FactoryMethod)模式的定義:定義一個建立產品對象的工廠接口,將產品對象的實際建立工做推遲到具體子工廠類當中。spa

這知足建立型模式中所要求的「建立與使用相分離」的特色。設計

咱們把被建立的對象稱爲「產品」,把建立產品的對象稱爲「工廠」。code

若是要建立的產品很少,只要一個工廠類就能夠完成,這種模式叫「簡單工廠模式」,它不屬於 GoF 的 23 種經典設計模式,它的缺點是增長新產品時會違背「開閉原則」。對象

本節介紹的「工廠方法模式」是對簡單工廠模式的進一步抽象化,其好處是可使系統在不修改原來代碼的狀況下引進新的產品,即知足開閉原則。blog

工廠方法模式的主要優勢有:接口

  • 用戶只須要知道具體工廠的名稱就可獲得所要的產品,無須知道產品的具體建立過程;
  • 在系統增長新的產品時只須要添加具體產品類和對應的具體工廠類,無須對原工廠進行任何修改,知足開閉原則;

結構與實現

工廠方法模式由抽象工廠、具體工廠、抽象產品和具體產品4個要素構成。ip

模式的結構

工廠方法模式的主要角色以下。開發

  1. 抽象工廠(Abstract Factory):提供了建立產品的接口,調用者經過它訪問具體工廠的工廠方法 newProduct() 來建立產品。
  2. 具體工廠(ConcreteFactory):主要是實現抽象工廠中的抽象方法,完成具體產品的建立。
  3. 抽象產品(Product):定義了產品的規範,描述了產品的主要特性和功能。
  4. 具體產品(ConcreteProduct):實現了抽象產品角色所定義的接口,由具體工廠來建立,它同具體工廠之間一一對應。

class AbstractFactory(object):
    '''抽象工廠接口'''
    def new_product(self):
        '''
        提供了建立產品的接口,調用者經過它訪問具體工廠的工廠方法 newProduct() 來建立產品。
        :return: AbstractProduct
        '''
        pass

class ConcreteFactory1(AbstractFactory):
    def new_product(self):
        print("具體工廠1 --> 具體產品1")
        return ConcreteProduct1()

class ConcreteFactory2(AbstractFactory):
    def new_product(self):
        print("具體工廠2 --> 具體產品2")
        return ConcreteProduct2()

class AbstractProduct(object):
    '''抽象產品接口'''
    def show(self):
        '''
        定義了產品的規範,描述了產品的主要特性和功能。
        :return: void
        '''
        pass

class ConcreteProduct1(AbstractProduct):
    def show(self):
        print("具體產品1 被生產")

class ConcreteProduct2(AbstractProduct):
    def show(self):
        print("具體產品2 被生產")

if __name__ == '__main__':
    cf1 = ConcreteFactory1()
    cf2 = ConcreteFactory2()
    cp1 = cf1.new_product()
    cp2 = cf2.new_product()
    cp1.show()
    cp2.show()
具體工廠1 --> 具體產品1
具體工廠2 --> 具體產品2
具體產品1 被生產
具體產品2 被生產

應用場景

工廠方法模式一般適用於如下場景。

  • 客戶只知道建立產品的工廠名,而不知道具體的產品名。如 TCL 電視工廠、海信電視工廠等。
  • 建立對象的任務由多個具體子工廠中的某一個完成,而抽象工廠只提供建立產品的接口。
  • 客戶不關心建立產品的細節,只關心產品的品牌。

模式的擴展

當須要生成的產品很少且不會增長,一個具體工廠類就能夠完成任務時,可刪除抽象工廠類。這時工廠方法模式將退化到簡單工廠模式,其結構圖如圖所示。

class Payment(object):
    '''抽象產品'''
    def pay(self):
        pass

class Alipay(Payment):
    def pay(self):
        print('Alipay paid the money!')

class WXpay(Payment):
    def pay(self):
        print("WXpay paid the money!")

class PayMethod(object):
    def create_payment(self, pay_method):
        if pay_method == 'alipay':
            return Alipay()

        if pay_method == 'wxpay':
            return WXpay()

if __name__ == '__main__':
    pm1 = PayMethod()
    alipay = pm1.create_payment('alipay')
    alipay.pay()
    wxpay = pm1.create_payment('wxpay')
    wxpay.pay()
Alipay paid the money!
WXpay paid the money!
相關文章
相關標籤/搜索