设计模式(5)-单例模式
单例模式是什么?
单例模式,顾名思义,就是整个类只提供一个实例对象,供外部使用。
从设计模式的角度看,单例模式是一种退化的简单工厂模式,其中工厂的创建方法就是产品类自身的静态方法,并且创建出的产品对象只有一个,循环使用。
单例模式的三个要素是:
(1)单例类只有一个实例对象;
(2)单例类必须自行创建此实例对象;
(3)单例类必须自行向系统提供此实例对象。
为了得到单例,需要对类的构造函数进行限制,就C++而言,需要设置类构造函数为私有方法,并提供静态接口获取提供的单例。
C++单例实现
在C++11的代码实现中,使用较多的是Meyers单例实现,简单好用,它的类图如下:
示例代码如下:
#include <iostream> #include <string>
class Singleton { public: static Singleton &GetInstance() { static Singleton instance; return instance; } void SetStr(const std::string &str) { str_ = str; } std::string GetStr() const { return str_; } private: Singleton() = default; ~Singleton() = default; Singleton(const Singleton& rhs) = delete; Singleton &operator=(const Singleton& rhs) = delete;
std::string str_; };
int main() { auto &singletonA = Singleton::GetInstance(); singletonA.SetStr("This is a singleton.");
auto &singletonB = Singleton::GetInstance(); std::cout << singletonB.GetStr() << std::endl; }
|
输出:
Meyers单例的核心思路是利用静态变量的构造过程位于main函数之前这一特性,避免多个线程调用GetInstance()接口带来的并发构造实例问题,不使用锁仍可做到线程安全。
这是一种饿汉式实现,单例还有其它实现方式,比如double check实现等,这里不一一介绍。
参考
《Java与模式》第15章