注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。
测试环境:Ubuntu 10.10
GCC版本:9.2.0
一、单例模式(设计模式)
1)需求的提出
在架构设计时,某些类在整个系统生命期中最多只能有一个对象存在(Single Instance)
问题
如何定义一个类,使得这个类最多只能创建一个对象?
2)要控制类的对象数目,必须对外隐藏构造函数
3)思路:
- 将构造函数的访问属性设置为private(外界无法创建对象)
- 定义instance并初始化为NULL(以下为了只能创建一个对象)
- 当需要使用对象时,访问instance的值
*空值:创建对象,并用instance标记
*非空值:访问instance标记的对象
编程实验
单例模式初探
62-1.cpp
#include <iostream>
#include <string>
using namespace std;
class SObject
{
static SObject* c_instance; //用来标记对象
SObject(const SObject&); //不需要拷贝和赋值
SObject& operator= (const SObject&);
SObject()
{
}
public:
static SObject* GetInstance();
void print()
{
cout << "this = " << this << endl;
}
};
SObject* SObject::c_instance = NULL;
//单例模式关键点
SObject* SObject::GetInstance()
{
if( c_instance == NULL )
{
c_instance = new SObject();
}
return c_instance;
}
int main()
{
SObject* s = SObject::GetInstance();
SObject* s1 = SObject::GetInstance();
SObject* s2 = SObject::GetInstance();
s->print();
s1->print();
s2->print();
return 0;
}
操作:
1) g++ 62-1.cpp -o 62-1.out编译正确,打印结果:
this = 0x880f008
this = 0x880f008
this = 0x880f008
分析:
3个指针指向的地址一样,证明了一个类只创建了一个对象。创建对象方式都被私有化了,只提供自定义创建对象一个方式。(很像全局变量,只不过单例类可以有更强大的功能)
设计分析:
1、定义静态成员变量为空,用来标记对象(定义成静态,让每个对象具有相同属性)
2、将所有创建对象方式都私有化(为了防止运行期间再次被创建新的对象),只提供静态成员函数static SObject* GetInstance();返回静态成员便c_instance;(静态成员函数只能访问静态成员变量)
3、判断c_instance是否为空。变量为空创建对象;否则直接返回c_instance。(保持类只有一个对象)
4、单例模式要在系统运行周期一直存在,所以不需要释放(没有析构函数)
使用场合:整个系统运行中一直使用的类
4)存在的问题
- 需要使用单例模式时:
*必须定义静态成员变量c_instance(指向生成的对象)
*必须定义静态成员函数GetInstance() (静态成员函数只能访问静态成员变量)
5)解决方案
将单例模式相关的代码抽取出来,开发单例类模板。当需要单例类时,直接使用单例类模板。
单例类模板
Singleton.h(和单例类有关的代码)
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
template
< typename T >
class Singleton
{
static T* c_instance;
public:
static T* GetInstance();
};
template
< typename T >
T* Singleton<T>::c_instance = NULL;
template
< typename T >
T* Singleton<T>::GetInstance()
{
if( c_instance == NULL )
{
c_instance = new T();
}
return c_instance;
}
#endif
62-2.cpp
#include <iostream>
#include <string>
#include "Singleton.h"
using namespace std;
class SObject //所有创建对象过程都私有化
{ //类模板与类模板友元
friend class Singleton<SObject>; // 当前类需要使用单例模式声明类模板
SObject(const SObject&);
SObject& operator= (const SObject&);
SObject()
{
}
public:
void print()
{
cout << "this = " << this << endl;
}
};
int main()
{
SObject* s = Singleton<SObject>::GetInstance();
SObject* s1 = Singleton<SObject>::GetInstance();
SObject* s2 = Singleton<SObject>::GetInstance();
s->print();
s1->print();
s2->print();
return 0;
}
操作:g++编译,打印结果:
this = 0x9621008
this = 0x9621008
this = 0x9621008
小结
1)单例模式是开发中最常用的设计模式之一
2)单例模式的应用使得一个类最多只有一个对象
3)可以将单例模式相关的代码抽象成类模板
4)需要使用单例模式的类直接使用单例类模板