在现实生活中社会分工愈来愈细,愈来愈专业化。各类产品有专门的工厂生产,完全告别了自给自足的小农经济时代,这大大缩短了产品的生产周期,提升了生产效率。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!