【设计模式】C++设计模式(全26讲)
单例模式
单例模式(Singleton Pattern,也称为单件模式),使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
定义一个单例类:
- 私有化它的构造函数,以防止外界创建单例类的对象;
- 使用类的私有静态指针变量指向类的唯一实例;
- 使用一个公有的静态方法获取该实例。
懒汉模式
即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。
需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的 if 语句,从而non thread safety.
使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。
1. 静态成员实例的懒汉模式:
1 | class Singleton |
2. 内部静态实例的懒汉模式:
1 | class SingletonInside |
饿汉模式
即无论是否调用该类的实例,在程序开始时就会产生一个该类的实例,并在以后仅返回此实例。
由静态初始化实例保证其线程安全性,WHY?因为静态实例初始化在程序开始时进入主函数之前就由主线程以单线程方式完成了初始化,不必担心多线程问题。
故在性能需求较高时,应使用这种模式,避免频繁的锁争夺。
饿汉模式:
1 | class SingletonStatic |
m_pInstance 指向的空间什么时候释放呢?更严重的问题是,该实例的析构函数什么时候执行?
单例模式 - 线程安全
1 |
|
1 | 输出结果如下: |
类 CGarbo 被定义为 CSingleton 的私有内嵌类,以防该类被在其他地方滥用。
程序运行结束时,系统会调用 CSingleton的 静态成员 Garbo 的析构函数,该析构函数会删除单例的唯一实例。
使用这种方法释放单例对象有以下特征:
在单例类内部定义专有的嵌套类;
在单例类内定义私有的专门用于释放的静态成员;
利用程序在结束时析构全局变量的特性,选择最终的释放时机;
使用单例的代码不需要任何操作,不必关心对象的释放。
工厂模式
在C++中利用反射和简单工厂模式实现业务模块解耦
用一个单独的类来做创造实例的过程,就是工厂。
简单工厂模式
简单工厂模式基本代码:
1 |
|
1 | class OperationFactory { |
面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。
工厂方法模式
工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
工厂方法模式基本代码:
1 |
|
把简单工厂模式中的工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后所有的要生产具体类的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,就变成了一个工厂抽象接口和多个具体生成对象的工厂。
这样整个工厂和产品体系就没有修改,而只是扩展,符合开放 - 封闭原则。
抽象工厂模式
抽象工厂模式是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式基本代码:
1 |
|
抽象工厂函数的优缺点
优点:
- 易于交换产品系列,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这样就使得改变一个应用的具体工厂变得非常容易,只需要改变具体工厂即可使用不同的产品配置。
- 让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂实现分离,不会出现在客户代码中。
缺点:增加新的产品时需要改动多处代码。