您的位置:首页 > 其它

单例模式

2016-02-20 16:18 134 查看
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。

如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。

一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。

模式定义

单例模式 : 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例(只要包含了该类头文件,那么整个系统将只有一个实例),这个类称为单例类,它提供全局访问的方法。

单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。

其UML图如下:



以下是简单的C++实现:

头文件:

//Singleton.h
class Singleton
{
private:
Singleton(); //防止外界利用new创建此类的可能

public:
static Singleton* getInstance();
void singletonOperation();
};


实现:

Singleton.cpp
//  Implementation of the Class
#include "Singleton.h"
#include <iostream>
using namespace std;
Singleton * Singleton::instance = NULL;
Singleton::Singleton()
{}
Singleton::~Singleton()
{
delete instance;
}
Singleton* Singleton::getInstance()
{
if (instance == NULL)
{
instance = new Singleton();
}
return  instance;
}
void Singleton::singletonOperation()
{
cout << "singletonOperation" << endl;
}


测试代码:

#include <iostream>
#include "Singleton.h"
using namespace std;
int main(int argc, char *argv[])
{
Singleton * sg = Singleton::getInstance();
sg->singletonOperation();
return 0;
}


小结

单例模式是一种保证整个程序只有一个类实例的设计方法。应该提供接口用于获得实例对象(如getInstance),并且避免主动调用new来实例化对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: