Singleton(DesignPattern)

Singleton

目的

在某些应用环境下,我们希望一个类只提供一个实例,用户只能使用一个实例

## 做法

一般来说,我们在类内维持一个静态的成员变量和静态成员函数,在函数内对成员变量进行初始化(准确点说应该是分配对象)

## 注意问题

  1. 所有函数都定义为static,并不是好的单例模式,一是因为我们无法保证静态变量的初始化顺序,加入是两个单例类互相使用,这样就无法保证互相的一来关系,另外的问题就是可能失去了面向对象的关键特性——多态

  2. 还有一个是如果我们的静态变量是一个对象,那么程序一开始运行,对象就已经存在了,镇不是我们需要的

  3. 如果我们希望灵活地使用不同的对象(以后拓展),可以在类内增加一个注册机制,根据环境变量返回不同类型的实例

  4. 最后返回指针可能会有一个问题就是,程序员可能会自行去销毁指针所指向的对象,这样就无法再次拥有这个实例了

代码示例

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
#include <iostream>

class Singleton {
public:
static Singleton& Instance() {
static Singleton p_Instance;
//if (p_Instance == NULL)
// p_Instance = new Singleton();
return p_Instance;
}
virtual void print(){
std::cout << "Singleton " << std::endl;
}
private:
//static Singleton *p_Instance;
Singleton(){}
Singleton(const Singleton& ){}
Singleton& operator=(Singleton const&){}
};

//Singleton* Singleton::p_Instance = NULL;

int main()
{
Singleton::Instance().print();
return 0;
}