单例模式需求的提出 :在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在(Single Instance)。如:超市收银系统中,一个显示器、一个扫描枪、一个键盘…问题:如何定义一个类,使得这个类最多只能创建一个对象呢?要控制类的对象数目,必须对外隐藏构造函数思路:将构造函数的访问属性设置为 private定义 instance 并初始化为 NULL当使用对象时,访问 instance 的值空值: 创建对象,并用 instance 标记非空值: 返回 instance 标记的对象编程实验: 单例模式初探#include <iostream>using namespace std;class SObject{private: static SObject* c_instance; SObject& operator=(const SObject&); SObject(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;}输出:this = 0x8069008this = 0x8069008this = 0x8069008存在的问题需要使用单例模式时:必须在使用的类中定义静态成员变量 c_instance必须在使用的类中定义静态成员函数 GetInstance()解决方案将单例模式相关的代码抽取出来,开发单例类模板。当需要单例类时,直接使用单例类模板编程实验: 单例类模板Singleton.h#ifndef SINGLETON_H#define _SINGLETON_H_template < typename T >class Singleton{private: 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;}#endifmain.cpp#include <iostream>#include “Singleton.h"using namespace std;class SObject{private: friend class Singleton<SObject>; // 当前类需要使用单例模式 SObject& operator=(const SObject&); SObject(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;}输出:this = 0x8188008this = 0x8188008this = 0x8188008小结单例模式是开发中最常用的设计模式之一单例模式的应用使得一个类最多只有一个对象可以将单例模式相关的代码抽象成类模板需要使用单例模式的类直接使用单例类模板以上内容参考狄泰软件学院系列课程,请大家保护原创