设计模式(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;
}

输出:

This is a singleton.

Meyers单例的核心思路是利用静态变量的构造过程位于main函数之前这一特性,避免多个线程调用GetInstance()接口带来的并发构造实例问题,不使用锁仍可做到线程安全。

这是一种饿汉式实现,单例还有其它实现方式,比如double check实现等,这里不一一介绍。

参考

《Java与模式》第15章