单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。 |
单例模式有三个要点:
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
单例模式是结构最简单的设计模式一,在它的核心结构中只包含一个被称为单例类的特殊类,确保对象的唯一性。
单例模式结构如图3-2所示:
单例模式结构图中只包含一个单例角色:
● Singleton(单例):在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。
******************************************************************
代码实现:
#include <iostream>
using namespace std;
////////////////////////////
class Single
{
public:
~Single(){}
/*
为了保证成员变量的封装性,我们将Single类型的对象的可见性设置为private,但外界该如何使用该成员变量并何时实例化该成员变量呢?答案是增加一个公有的静态方法getInstance()。
在getInstance()方法中首先判断instance对象是否存在,如果不存在(即instance== null),则使用new关键字创建一个新的Single类型的对象,再返回新创建的对象;否则直接返回已有的对象。
需要注意的是getInstance()方法的修饰符,首先它应该是一个public方法,以便供外界其他对象使用,其次它使用了static关键字,即它是一个静态方法,在类外可以直接通过类名来访问,而无须创建Single对象,事实上在类外也无法创建Single对象,因为构造函数是私有的。
*/
static Single* getInstance()
{
if (instance == NULL)
instance = new Single();
return instance;
}
private:
/*
为了确保Single实例的唯一性,我们需要禁止类的外部直接使用new来创建对象,
因此需要将Single的构造函数的可见性改为private
*/
Single()
{
cout<<"Single..."<<endl;
}
/*
类的外部无法再使用new来创建对象,但是在Single的内部还是可以创建的,可见性只对类外有效。
因此,我们可以在Single中创建并保存这个唯一实例。为了让外界可以访问这个唯一实例,需要在Single中定义一个静态的TaskManager类型的私有成员变量。
*/
static Single* instance;
};
//////
Single* Single::instance = NULL;
/////////////////////////////
/*
在类外我们无法直接创建新的Single对象,但可以通过代码Single::getInstance()来访问实例对象,第一次调用getInstance()方法时将创建唯一实例,再次调用时将返回第一次创建的实例,从而确保实例对象的唯一性。
*/
int main()
{
Single* sgn = Single::getInstance();
return 0;
}
******************************************************************
原文:http://blog.csdn.net/gaoxin12345679/article/details/19362879