Singleton模式

来源:互联网 发布:教师网络研修计划 编辑:程序博客网 时间:2024/06/05 04:03

Singleton模式

模式选择

Singleton模式是解决怎么创建唯一对象问题的。
在面向过程的设计语言中,我们可以通过创建全局对象来实现;
在面向对象的设计语言中,也可以这样做,但是除此之外还有更好的解决方法:Singleton模式。
Singleton模式十分简单,用一个static成员变量来记录唯一的对象实例,通过static接口来获取此实例,在类外禁用构造函数防止创建类的实例。

下面是Singleton模式典型的结构图:

 

图1 Singleton Pattern 结构图

在Singleton 模式的结构图中可以看到,我们通过维护一个static 的成员变量来记录这个唯一的对象实例。通过提供一个staitc 的接口instance 来获得这个唯一的实例。

实现

下面通过一个例子来演示。在例子中有一个data,初始化为0,创建一个实例,之后把data改为10,再创建另外一个实例,可以看到新创建的实例中data仍然为10,且构造函数只运行了一次。

完整的示例代码如下:

代码片段一:singleton.h

//Singleton.h#ifndef _SINGLETON_H_#define _SINGLETON_H_#include <iostream>using namespace std;class Singleton{public:static Singleton* Instance();protected:Singleton();private:static Singleton* _instance;};#endif //~_SINGLETON_H_
代码片段二:singleton.cpp

//Singleton.cpp#include "Singleton.h"#include <iostream>using namespace std;Singleton* Singleton::_instance = 0;Singleton::Singleton(){cout<<"Singleton...."<<endl;}Singleton* Singleton::Instance(){if (_instance == 0){_instance = new Singleton();}return _instance;}
代码片段三:main.cpp
//main.cpp#include "Singleton.h"#include <iostream>using namespace std;int main(int argc,char* argv[]){Singleton* sgn = Singleton::Instance();return 0;}

代码说明

Singleton 模式的实现无须补充解释,需要说明的是,Singleton 不可以被实例化,因此我们将其构造函数声明为protected 或者直接声明为private。

讨论

Singleton 模式经常和Factory(AbstractFactory)模式在一起使用。

Singleton 模式在开发中经常用到,且不说我们开发过程中一些变量必须是唯一的,比如说打印机的实例等等。


0 0