单例模式Singleton

  • 懒汉式:获取实例时才创建
  • 饿汉式:定义时创建好实例,考虑全局变量的创建时机

    懒汉式的线程安全问题

  • 在多个线程中同时获取实例,此时可能出现多个构造函数被同时调用

    • 线程锁和二次检查
      1. if (instance == NULL)
      2. {
      3. // 多个线程进入此处,同一时刻只有一个线程可以获得锁,创建实例
      4. lock();
      5. // 二次检查防止后续获取锁的线程重复创建实例
      6. if (instance == NULL)
      7. {
      8. instance = new Singleton();
      9. }
      10. unlock();
      11. return instance;
      12. }

      工厂模式Factory

      简单工厂

      提供一个创建对象示例的功能,而无需关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。

      • Api: 定义客户所需要的功能接口
      • Impl: 具体实现Api的实现类,可能存在多个
      • Factory: 工厂,选择合适的实现类来创建Api接口对象
      • Client: 客户端,通过Factory来获取Api接口对象,然后面向Apij接口编程

      ——《研磨设计模式》:第二章 简单工厂

  • 用于隔离接口和实现

  • 一个抽象接口来描述不同实现的统一调用接口,工厂类负责创建不同的实现实例,实现隐藏在工厂方法内部 ```python import abc

class Interface(metaclass=abc.ABCMeta):

  1. @abc.abstractmethod
  2. def func(self):
  3. pass

class ImplA(Interface):

  1. def func(self):
  2. print('实例1')

class ImplB(Interface):

  1. def func(self):
  2. print('示例2')

class Factory():

  1. def create_instance(self, arg: int) -> Interface:
  2. if arg == 1:
  3. return ImplA()
  4. elif arg == 2:
  5. return ImplB()
  6. else:
  7. return None

if name == ‘main‘: fac = Factory()

  1. ins = fac.create_instance(1)
  2. ins.func()
  3. ins = fac.create_instance(2)
  4. ins.func()

```

工厂模式

  • 相较于简单工厂,工厂模式对‘工厂’增加一层抽象,通过不同的‘工厂’实现去创建不同的‘产品’实例

    • 优点:实现了‘工厂’与‘产品’的解耦,当我们需要增加新的‘产品’时U4HIY7OUQK只需要增加一个相应的‘工厂’即可,而不用去修改原有的代码(开闭原则)

      抽象工厂模式AbstractFactory

  • 相较于工厂模式只能创建单一‘产品’,抽象工厂用于生产一个‘产品族’

    建造者模式Builder

  • 一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离

    • Builder:为创建产品的各个部分,统一抽象接口
    • ConcreateBuilder:具体的创建产品的各个部分
    • Director:构造一个使用Builder接口的对象
    • Product:被构造的复杂对象

      外观模式Facade

      为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 界面:此处主要指从一个组件外部来看这个组件,能够看到什么。如:一个类的public方法和属性就是一个类的界面,一个模块的对外接口就是一个模块的界面 接口:此处的接口主要外部和内部交互的通道 ——《研磨设计模式》:第三章 外观模式