简单工厂模式-设计模式-第三篇

1.设计模式的分类

根据使用功能的不同 设计模式分为三类:

1.1 创建型模式

实例化对象 生成对象的时候
工厂模式,抽象工厂模式,创建者模式,原型模式,单例模式

1.2 结构型模式

对象与预想之间 类与类之间 如何组合
适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式

1.3 行为模式

主要聚焦于 类中的method
解释器模式, 责任链模式 命令模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 访问者模式 模板方法模式

2. 简单工厂模式

看看如下的例子

from abc import ABCMeta, abstractmethod


class Payment(metaclass=ABCMeta):

    @abstractmethod
    def pay(self, money):
        pass


class Alipay(Payment):

    def pay(self, money):
        print("Ali payed %d" % money)


class WechatPay:

    def pay(self, money):
        print("Wechat pay %d" % money)


class PaymentFactory:

    def create_payment(self, method):
        if method == "alipay":
            return Alipay()
        elif method == "wechat":
            return WechatPay()


if __name__ == '__main__':
    pf = PaymentFactory()
    p = pf.create_payment("wechat")
    p.pay(100)

假设又增加了一种支付方法 花呗支付

from abc import ABCMeta, abstractmethod


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("Ali payed %d" % money)


class WechatPay:

    def pay(self, money):
        print("Wechat pay %d" % money)


class PaymentFactory:

    def create_payment(self, method):
        if method == "alipay":
            return Alipay()
        elif method == "huabei":
            return Alipay(use_huabei=True)
        elif method == "wechat":
            return WechatPay()
        else:
            raise ValueError("不支持的支付方式")


if __name__ == '__main__':
    pf = PaymentFactory()
    p = pf.create_payment("huabei")
    p.pay(100)

总结一下:什么是简单工厂模式?
不直接向客户暴露创建对象的细节 而是通过一个工厂类的create_xxx方法来创建具体的实例
可以这么认为: 这个类 将各种 实例化类 创建类的方法 封装成一个method 由这个method来实现
根据不同的需要 具体的类的实例化

简单工厂模式的组成角色:

  1. 工厂角色 PaymentFactory
  2. 抽象产品 Payment 这个抽象类
  3. 具体的产品角色 AliPayment

简单工程模式的优缺点:
优点:

  • 隐藏了对象创建的具体细节
  • 客户端不需要修改代码
    缺点:
  • 违反了单一职责 原则 常见逻辑 集中到一个 工厂类里面
  • 当添加新的产品时, 例如新的支付方式 银联支付 就需要修改工厂类(PaymentFactory)的代码 违反了开闭原则
posted @ 2021-04-28 20:19  jack-chen666  阅读(49)  评论(0编辑  收藏  举报