设计模式笔记之---单例模式
单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。
UML类图:
实现方法:
1.创建一个指向唯一实例的静态指针,并且是私有的。
2.提供一个公用的接口,已获取这个唯一的实例,如果唯一实例不存在,在接口内部首先将它创建出来。
3.将类的构造函数设置为私有的,保证用户不能通过其它方式创建实例。
4.将类的析构函数设置为私有的,因为类只有一个实例,不能让用户随便删除,这样用户调用delete来释放实例对象时,编译器会报错,指示非法。
单例模式基本代码如下:
[cpp]
/********************************************************************
filename: Singleton.h
created: 2012-09-24
author: firehood
purpose: firehood 学设计模式之---单例模式
*********************************************************************/
#include<stdio.h>
#pragma once
class 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;
};
[cpp]
/********************************************************************
filename: Singleton.cpp
created: 2012-09-24
author: firehood
purpose: 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;
}
}
客户端调用代码:
[cpp]
#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为同一个实例
请按任意键继续. . .
释放实例内存..
补充:软件开发 , C++ ,