定義:定義一個建立對象的接口(工廠接口),讓子類決定實例化哪一個接口。微信
角色:抽象工廠角色,具體工廠角色,抽象產品角色,具體產品角色。微信支付
適用場景:須要生產多種,大量複雜對象的時候,須要下降代碼耦合度的時候,當系統中的產品類常常須要擴展的時候。對象
優勢:每一個具體的產品都對應一個具體工廠,不須要修改工廠類的代碼,工廠類能夠不知道它所建立的具體的類,隱藏了對象建立的實現細節。接口
缺點:每增長一個具體的產品類,就必須增長一個相應的工廠類。支付寶
代碼實現:產品
from abc import ABCMeta, abstractmethod 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 PaymentFactory(metaclass=ABCMeta): # 抽象工廠 @abstractmethod def create_payment(self): pass class AliPayFactory(PaymentFactory): # 具體工廠 def create_payment(self): return AliPay() class ApplePayFactory(PaymentFactory): def create_payment(self): return ApplePay() af = AliPayFactory() ali = af.create_payment() ali.pay(100) # 若是要新增支付方式 class WechatPay(Payment): def pay(self, money): print('使用微信支付%s元' % money) class WechatPayFactory(PaymentFactory): def create_payment(self): return WechatPay() w = WechatPayFactory() wc = w.create_payment() wc.pay(200)