[C++][设计模式] : 单例模式(饿汉和懒汉)
单例模式
引言
对于程序设计的时候,我们有些时候不希望平凡的创建对象,比如创建这个一个对象的成本很高,比如线程池,这个时候我们希望共享一个对象,这个时候,就可以使用我们的单例模式。
单例模式本质上是一种程序设计的方式,我们通过合理的设计,使得某一种类只能定义一次,通过类的静态的方式调用
防止拷贝构造和赋值重载
其实只需要防止拷贝构造即可,因为构造不成功,更不可能赋值重载。
我们提供一种优雅的方式,继承nocopy类
// 定义不能拷贝的类作为基类
class NoCopy
{
public:NoCopy() = default;// 将拷贝构造和赋值重载删除NoCopy(const NoCopy&) = delete;NoCopy& operator=(const NoCopy&) = delete;
};
通过继承实现单例模式
这里我只使用了C++11, 也可以使用C++17的更高级的特性简化
class Object : public NoCopy
{
private:Object() {}
public:Object& getInstance(){if (self == nullptr) self = std::unique_ptr<Object>();return *self;}static std::unique_ptr<Object> self;
};std::unique_ptr<Object> Object::self = nullptr;
在这种情况下,我们只需要调用Object::getInstance()
就可以直接获取到对象。
饿汉和懒汉模式
上面我创建的思想是懒汉模式。
饿汉模式就是无论我是否使用这个单例对象,我都会在执行程序的时候创建一个对象
懒汉模式更像是一种延迟定义,只有我们需要使用它的时候,我们才进行创建
- 恶汉模式: 直接创建
std::unique_ptr<Object> Object::self = std::make_unique(); // make_unique是C++14支持 Object& getInstance() { return *self; }
- 懒汉模式 : 延迟创建
Object& getInstance(){if (self == nullptr) self = std::unique_ptr<Object>();return *self;} std::unique_ptr<Object> Object::self = nullptr;