一、内容
不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。
二、角色
工厂角色(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)