Fork me on GitHub

简单工厂模式

一、内容

不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。

二、角色

  • 工厂角色(Creator)
  • 抽象产品角色(Product)
  • 具体产品角色(Concrete Product)

三、优点

  • 隐藏了对象创建的实现细节
  • 客户端不需要修改代码

四、缺点

  • 违反了单一职责原则,将创建逻辑集中到一个工厂类中
  • 当添加新产品时,需要修改工厂类代码,违反了开放封闭原则

五、代码示例

 1 from abc import abstractmethod,ABCMeta
 2 class Payment(metaclass=ABCMeta):
 3     @abstractmethod
 4     def pay(self):
 5         pass
 6 
 7 class Alipay(Payment):
 8     def __init__(self,money):
 9         self.money = money
10 
11     def pay(self):
12         print('支付宝支付了%s元'%self.money)
13 
14 class Whatpay(Payment):
15     def __init__(self, money):
16         self.money = money
17 
18     def pay(self):
19         print('微信支付了%s元' % self.money)
20 
21 
22 obj = Alipay(100)
23 obj.pay()
24 
25 obj2 = Whatpay(200)
26 obj2.pay()
初始的
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 Applepay(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)

 

posted on 2018-03-03 01:27  vmaze  阅读(167)  评论(0编辑  收藏  举报

导航