对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或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>
#include <new> // std::nothrow
using namespace std;
Singleton * Singleton::instance = NULL;
Singleton::Singleton()
{}
Singleton::~Singleton()
{
delete instance;
}
Singleton* Singleton::getInstance()
{
if (instance == NULL)
{
instance = new (std::nothrow) 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 来实例化对象。
注意,上述单例模式代码,并不是线程安全。