python设计模式--简单工厂模式

简单工厂模式

内容

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

角色

工厂角色
抽象产品角色
具体产品角色

优点

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

缺点

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

简单工厂模式的不足:

在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,
它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。
简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,
加入必要的处理逻辑,这违背了“开闭原则”。在简单工厂模式中,所有的产品都是由同一个工厂创建,
工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,
严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。

class Payment(metaclass=ABCMeta):  # 抽象产品角色
    @abstractmethod
    def pay(self, money):
        pass


class Alipay(Payment):  # 具体产品角色
    def __init__(self, use_huabei=False):
        self.use_huabei = use_huabei

    def pay(self, money):
        if self.use_huabei:
            print('花呗支付%d元.' % money)
        else:
            print('支付宝余额支付%d元.' % money)


class WechatPay(Payment):
    def pay(self, money):
        print('微信支付%d元.' % money)


class BankPay(Payment):
    def pay(self, money):
        print('银行卡支付%d元.' % money)


print('---------------------------------------------')



class PaymentFactory:   # 工厂角色
    def create_payment(self, method):
        if method == 'alipay':
            return Alipay()
        elif method == 'wechat':
            return WechatPay()
        elif method == 'huabei':
            return Alipay(use_huabei=True)
        else:
            raise TypeError('No such payment named %s' % method)

#client
pf = PaymentFactory()
p = pf.create_payment('huabei')
p.pay(100)
posted @ 2021-03-31 21:51  MrSatan  阅读(73)  评论(0编辑  收藏  举报