工厂模式

客户端请求一个对象,而无需知道这个对象来自哪里;也就是使用哪个类来生成这个对象。
工厂背后的思想是简化对象的创建。与客户端自己基于类实例化直接创建对象相比,基于一个中心化函数来实现,更易于追踪创建了哪些对象

工厂的两种形式:

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:
冲压不同汽车模型的部件所使用的基件是相同的。机件装配起来的模型随时可配置,且易于改变

优点:在使用工厂方法是从用户视角通常是看不到的,那就是抽象工厂能够通过改变激活的工厂方法动态地改变应用行为。
    一个经典例子是能够让用户在使用应用时改变应用的观感,而不需要终止应用然后重新启动。

 

场景:
我们正在创造一个游戏,或者想在应用中包含一个迷你游戏让用户娱乐娱乐。我们希望至少包含两个游戏,一个面向孩子,一个面向成人,在运行时,基于用户输入,决定该创建哪个游戏并运行,游戏的创建部分由一个抽象工厂维护

 

posted @ 2018-12-16 11:37  慕沁  阅读(139)  评论(0)    收藏  举报