设计模式笔记之---单例模式

来源:互联网 发布:阿里云80端口备案 编辑:程序博客网 时间:2024/05/18 00:32

单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。   

UML类图:

                  

实现方法:

1.创建一个指向唯一实例的静态指针,并且是私有的。

2.提供一个公用的接口,已获取这个唯一的实例,如果唯一实例不存在,在接口内部首先将它创建出来。

3.将类的构造函数设置为私有的,保证用户不能通过其它方式创建实例。

4.将类的析构函数设置为私有的,因为类只有一个实例,不能让用户随便删除,这样用户调用delete来释放实例对象时,编译器会报错,指示非法。

单例模式基本代码如下:

/********************************************************************filename: Singleton.hcreated:2012-09-24author:firehoodpurpose:firehood 学设计模式之---单例模式*********************************************************************/#include<stdio.h>#pragma onceclass Singleton{public:static Singleton* GetInstance(void);private:static void Destory(void);Singleton(void);~Singleton(void);    Singleton(const Singleton&);Singleton& operator = (const Singleton&);private:static Singleton* pInstance;};

/********************************************************************filename: Singleton.cppcreated:2012-09-24author:firehoodpurpose:firehood 学设计模式之---单例模式*********************************************************************/#include "Singleton.h"#include <iostream>using namespace std;Singleton* Singleton::pInstance = NULL;Singleton::Singleton(void){}Singleton::~Singleton(void){}Singleton* Singleton::GetInstance(void){if(pInstance == NULL){pInstance = new Singleton();// 注册终止函数(进程退出时调用)atexit(Destory);}return pInstance;}void Singleton::Destory(void){if(pInstance){cout<< "释放实例内存.."<<endl;delete pInstance;pInstance = NULL;}}


客户端调用代码:

#include "Singleton.h"#include <iostream>using namespace std;int main(int argc,char* argv[]){cout<<"*************************************"<<endl;cout<<"firehood 学设计模式之---单例模式"<<endl;cout<<"*************************************"<<endl;    Singleton* pInstance1 = Singleton::GetInstance();cout<<"实例1:"<<hex<<pInstance1<<endl;Singleton* pInstance2 = Singleton::GetInstance();cout<<"实例2:"<<hex<<pInstance2<<endl;if(pInstance1 == pInstance2){cout<<"实例1和实例2为同一个实例"<<endl;}system("pause");return 0;}

运行结果:

*************************************
firehood 学设计模式之---单例模式
*************************************
实例1:003A64E8
实例2:003A64E8
实例1和实例2为同一个实例
请按任意键继续. . .

释放实例内存..