工厂模式
客户端请求一个对象,而无需知道这个对象来自哪里;也就是使用哪个类来生成这个对象。
工厂背后的思想是简化对象的创建。与客户端自己基于类实例化直接创建对象相比,基于一个中心化函数来实现,更易于追踪创建了哪些对象
工厂的两种形式:
1、工厂方法 ;一个函数 2、抽象工厂 ;一组函数
- 想要追踪对象的创建时
- 想要将对象的创建与使用解耦时
- 想要优化应用的性能和资源占用时
1、工厂方法
eg: 制造塑料玩具的压缩分都是一样的,但是使用不同的塑料模具就能产出不同的外形
django框架中:表单字段的创建
优点:基于一个中心化函数来实现,更易于追踪创建了哪些对象
工厂方法可以在必要时创建新的对象,从而提高性能和内存利用率;而直接实例化创建对象就需要分配内存,除非内部使用了缓存。
from abc import abstractmethod,ABCMeta class Payment(metaclass=ABCMeta): @abstractmethod def pay(self,money): pass class Alipay(Payment): def pay(self, money): print('支付宝支付了%s元'%money) class Yuebao(Payment): def pay(self,money): print('余额宝支付了%s元' %money) class PaymentFactory: '''工厂类:封装了对象创建的细节''' def create_payment(self,method): if method =='alipay': return Alipay() elif method =='applepay': return Applepay() elif method =='yuebao': return Yuebao() else: return NameError(method) factory = PaymentFactory() alipay=factory.create_payment('yuebao') alipay.pay(100)
2、抽象工厂
eg:
冲压不同汽车模型的部件所使用的基件是相同的。机件装配起来的模型随时可配置,且易于改变
优点:在使用工厂方法是从用户视角通常是看不到的,那就是抽象工厂能够通过改变激活的工厂方法动态地改变应用行为。
一个经典例子是能够让用户在使用应用时改变应用的观感,而不需要终止应用然后重新启动。
场景:
我们正在创造一个游戏,或者想在应用中包含一个迷你游戏让用户娱乐娱乐。我们希望至少包含两个游戏,一个面向孩子,一个面向成人,在运行时,基于用户输入,决定该创建哪个游戏并运行,游戏的创建部分由一个抽象工厂维护