一、内容
不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。
二、角色
工厂角色(Creator)
抽象产品角色(Product)
具体产品角色(Concrete Product)
三、优点
隐藏了对象创建的实现细节
客户端不需要修改代码
四、缺点
违反了单一职责原则,将创建逻辑集中到一个工厂类中
当添加新产品时,需要修改工厂类代码,违反了开放封闭原则
五、代码示例
初始的代码
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)