Singleton

单件

确保一个类只有一个实例,并只提供一个全局访问点。

适用性

  • 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

结构

Singleton Class

Singleton - 定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类操作(即C++中的一个静态成员函数)。可能负责创建它自己的唯一实例。

协作:
客户只能通过Singleton的Instance操作访问一个Singleton的实例。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 《剑指Offer》上提到的多线程下正常的实现
#include <iostream>
//---------------------------------------------------
class Singleton
{
public:
static Singleton* get_instance()
{

static Singleton m_instance;
return &m_instance;
}
int get_test()
{

return ++m_test;
}
private:
Singleton() {m_test = 0;}
int m_test;
};
//---------------------------------------------------
int main()
{

Singleton* singleton = Singleton::get_instance();
std::cout<<singleton->get_test()<<std::endl;

singleton = Singleton::get_instance();
std::cout<<singleton->get_test()<<std::endl;
system("Pause");
}

相关模式

  • 很多模式可以使用Singleton实现。如Abstract Factory/Builder/Prototype。

[1] 设计模式:可复用面向对象软件的基础
[2] Head First 设计模式
[3] 剑指Offer