赞
踩
在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在(Single Instance)
1、将构造函数的访问属性设置为private
2、定义instance并初始化为NULL;
3、当需要使用对象时,访问instance的值
1)、空值:创建对象,并用instance标记;
2)、非空值:返回instance标记的对象。
实例分析1
#include <iostream> #include <string> #include <cstdlib> //#include "Array.h" //#include <memory> //#include "SmartPointer.h" using namespace std; class SObject { static SObject* c_instance; //定义instance并初始化为NULL 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() { //空值:创建对象,并用instance标记 ,非空值:返回instance标记的对象 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; }
实例分析2 单例模板
maim.c
#include <iostream> #include <string> #include <cstdlib> //#include "Array.h" //#include <memory> //#include "SmartPointer.h" #include "Singleton.h" using namespace std; class SObject { friend 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; }
头文件
#ifndef SINGLETON_H #define SINGLETON_H template<typename T> class Singleton { static T* c_instance; //定义instance并初始化为NULL public: static T* GetInstance(); }; template<typename T> T* Singleton<T>::c_instance = NULL; template<typename T> T* Singleton<T>::GetInstance() { //空值:创建对象,并用instance标记 ,非空值:返回instance标记的对象 if(c_instance == NULL) { c_instance = new T(); } return c_instance; } #endif
1、单例模式是开发中最常用的设计模式之一;
2、单例模式的应用使得一个类最多只有一个对象;
3、可以将单例模式相关的代码抽象成模板;
4、需要使用单例模式的类直接使用单例模板。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。