在現實生活中社會分工愈來愈細,愈來愈專業化。各類產品有專門的工廠生產,完全告別了自給自足的小農經濟時代,這大大縮短了產品的生產週期,提升了生產效率。python
一樣,在軟件開發中可否作到軟件對象的生產和使用相分離呢?設計模式
工廠方法(FactoryMethod)模式的定義:定義一個建立產品對象的工廠接口,將產品對象的實際建立工做推遲到具體子工廠類當中。spa
這知足建立型模式中所要求的「建立與使用相分離」的特色。設計
咱們把被建立的對象稱爲「產品」,把建立產品的對象稱爲「工廠」。code
若是要建立的產品很少,只要一個工廠類就能夠完成,這種模式叫「簡單工廠模式」,它不屬於 GoF 的 23 種經典設計模式,它的缺點是增長新產品時會違背「開閉原則」。對象
本節介紹的「工廠方法模式」是對簡單工廠模式的進一步抽象化,其好處是可使系統在不修改原來代碼的狀況下引進新的產品,即知足開閉原則。blog
工廠方法模式的主要優勢有:接口
工廠方法模式由抽象工廠、具體工廠、抽象產品和具體產品4個要素構成。ip
工廠方法模式的主要角色以下。開發
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 被生產
工廠方法模式一般適用於如下場景。
當須要生成的產品很少且不會增長,一個具體工廠類就能夠完成任務時,可刪除抽象工廠類。這時工廠方法模式將退化到簡單工廠模式,其結構圖如圖所示。
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!