这是我参与「第五届青训营 」伴学笔记创作活动的第 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;