设计模式补充|青训营笔记

64 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 18 天

设计模式

单例模式:一个类仅有一个实例,提供一个访问它的全局访问点

简单工厂:创建对象,根据输入条件产生不同的类,根据不同类的虚函数得到不同的结果

抽象工厂:创建一系列相关或相互依赖的接口,而不指定他们的具体类

观察者:多个观察对象同时监听一个主题对象,主题对象发生变化时,会通知所有的观察者

装饰模式:不改变现有对象结构,动态地给一个对象添加一些额外的职责, 比派生类更为灵活

单例模式

为了对象唯一,构造函数private,拷贝和移动构造函数都被禁止

饿汉:类定义的时候就进⾏实例化(线程安全)。静态成员变量,一开始就创建好了

懒汉:第一次用到的类实例的时候才会去实例化。静态成员对象指针变量,一开始创建指针,用的时候再分配空间

对于一个普通类,我么可以生成任意对象,我们为了避免生成太多的类,需要将类的构造函数设为私有。

这样的话,我们为了获取实例,只能借助于类的内部函数,而且必须是static函数(非static函数中均包含一个隐式参数this,由于我们没办法实例化,所以只能通过static函数来获取实例)

饿汉:

class SingleInstance {

public:

    static SingleInstance* GetInstance() {

        static SingleInstance ins;

        return &ins;

    }

 

private:

    //涉及到创建对象的函数都设置为private

    SingleInstance() { std::cout << "SingleInstance() 饿汉" << std::endl; }

    SingleInstance(const SingleInstance& other) = delete;               //拷贝构造

    SingleInstance& operator=(const SingleInstance& other) = delete;    //拷贝赋值

    SingleInstance(SingleInstance&& other) = delete;                    //移动构造

    SingleInstance& operator=(const SingleInstance&& other) = delete;   //移动赋值

};

int main() {

    //因为不能创建对象所以通过静态成员函数的方法返回静态成员

    SingleInstance* ins = SingleInstance::GetInstance();

    return 0;

}

不需要将复制构造函数(和赋值运算符)设为私有,因为默认情况下它们将使用浅复制。但是,为什么要在Singleton类中实现复制构造函数。所以要用,就每次都getInstance

 

懒汉:DHCP双重锁定模式:第一层if判断防止创建单例后频繁对锁进行访问,效率低;第二层锁防止同时多个进程同时创建单例。

#include

using namespace std;

 

class Singleton

{

 public:

     static Singleton *getInstance() {

         if(pInstance_ == NULL) {

             mutex.lock();

             if(pInstance == NULL) //线程的切换

                 pInstance = new Singleton;

             mutex.unlock();

         }

         return pInstance;

     }

 private:

     Singleton() { }

 

     static Singleton *pInstance;

     static MutexLock mutex;

 };

 

 Singleton *Singleton::pInstance = nullptr;

 MutexLock Singleton::mutex;