首先,单例模式是对象的创建模式之一,单例模式的三个特点:
1,该类只有一个实例
2,该类自行创建该实例(在该类内部创建自身的实例对象)
3,向整个系统公开这个实例接口
有人可能会问这样的方式可以用在哪里,哪里比较适合使用?举个例子,倚天剑只有一把,可能在张无忌手中 可能在杨逍手中当然也有可能在赵敏手中,如果我们将倚天剑设置为一个普通的类,那么就可能出现一个倚天剑重复实例化的情况,金庸的世界可不是咱这,山寨货那么多。。。 所以这个时候将倚天剑当做一个单例类就可以避免这样的情况出现。
因此我们就可以设计出一个倚天剑的单例类:
头文件:
/*
版权说明: 本代码版权 为 糙级码lee 所有
转载请注明来自:http://blog.youkuaiyun.com/zerolxl
*/
#ifndef _SINGLETON_YITIANJIAN__H__
#define _SINGLETON_YITIANJIAN__H__
#include <string>
enum WHOHAND{
WH_UNKONW =0,
WH_ZHANGWUJI =1,
WH_ZHAOMING =2,
WH_YANGXIAO =3
};
class CSingletonYitianJian
{
public:
/*
func: GetInstance()
brief: 获得倚天剑
*/
static CSingletonYitianJian &GetInstance();
/*
func: OpChuZhao()
brief: 出招
*/
void OpChuZhao();
/*
@func: SetWhoHand(int enWhosHand);
@brief: 设置剑在谁手中
@param:
enWhosHand 谁的手中
*/
void SetWhoHand(int enWhosHand);
/*
@func: ShowInWhoHand();
@brief: 查看剑在谁手中
*/
void ShowInWhoHand();
private://构造函数
CSingletonYitianJian();// 声明 但不实现,防止产生了一个类拷贝
CSingletonYitianJian(const CSingletonYitianJian&);
CSingletonYitianJian & operator = (const CSingletonYitianJian&);
private:
WHOHAND m_enWhosHand; //见在谁手上
std::string m_strOwner; //拥有者
};
#endif
类文件:
/*
版权说明: 本代码版权 为 糙级码lee 所有
转载请注明来自:http://blog.youkuaiyun.com/zerolxl
*/
#include "stdafx.h"
#include "Singleton.h"
#include <string>
#include <iostream>
using namespace std;
CSingletonYitianJian::CSingletonYitianJian()
{
cout<< "磨剑 。。磨剑 。。 " <<endl;
cout << "天下第一剑 ..--||========>" <<endl;
m_strOwner="神秘人";
}
CSingletonYitianJian &CSingletonYitianJian::GetInstance(){
static CSingletonYitianJian instance;
return instance;
}
void CSingletonYitianJian::OpChuZhao()
{
cout<< m_strOwner+":出大招啦~~" <<endl;
}
void CSingletonYitianJian::SetWhoHand(int nWhosHand)
{
m_enWhosHand=(WHOHAND)nWhosHand;
switch (m_enWhosHand)
{
case WH_ZHAOMING:
m_strOwner="赵敏";
break;
case WH_ZHANGWUJI:
m_strOwner="张无忌";
break;
case WH_YANGXIAO:
m_strOwner="杨逍";
break;
default:
m_strOwner="神秘人";
m_enWhosHand=WH_UNKONW;
break;
}
}
void CSingletonYitianJian::ShowInWhoHand()
{
switch (m_enWhosHand)
{
case WH_UNKONW:
cout<< "倚天剑丢了。。。" <<endl;
m_strOwner="神秘人";
break;
case WH_ZHAOMING:
cout<< "倚天剑在赵敏手中" <<endl;
m_strOwner="赵敏";
break;
case WH_ZHANGWUJI:
cout<< "倚天剑在张无忌手中" <<endl;
m_strOwner="张无忌";
break;
case WH_YANGXIAO:
cout<< "倚天剑在杨逍手中" <<endl;
m_strOwner="杨逍";
break;
}
}
main函数:
/*
版权说明: 本代码版权 为 糙级码lee 所有
转载请注明来自:http://blog.youkuaiyun.com/zerolxl
*/
#include "stdafx.h"
#include "Singleton.h"
#include <string>
#include <iostream>
#include <windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"构造下~~\n"<<endl;
CSingletonYitianJian::GetInstance();
cout<<"\n"<<endl;
int i=rand()%3;
CSingletonYitianJian::GetInstance().SetWhoHand(i);
CSingletonYitianJian::GetInstance().ShowInWhoHand();
CSingletonYitianJian::GetInstance().OpChuZhao();
cout<<"\n"<<endl;
Sleep(1000);
i=rand()%4;
CSingletonYitianJian::GetInstance().SetWhoHand(i);
CSingletonYitianJian::GetInstance().ShowInWhoHand();
CSingletonYitianJian::GetInstance().OpChuZhao();
cout<<"\n"<<endl;
Sleep(1000);
i=rand()%3;
CSingletonYitianJian::GetInstance().SetWhoHand(i);
CSingletonYitianJian::GetInstance().ShowInWhoHand();
CSingletonYitianJian::GetInstance().OpChuZhao();
getchar();
return 0;
}
类图:
输出:
单例类适用场景:
在实际开发过程中,有时候我们可能遇到这样的情况,我们可能编写了很多个类,这个时候我们可能需要将这个许多类中产生的数据录到数据库中,我们需要创建一个数据库的操作句柄供给这许多类来使用,那么我们可能有两种解决方案:
1.修改 各个类的实现,将数据库操作句柄传递给各个类,保留为成员变量,然后用这个成员变量进行入库操作。
2.我们可以使用单例类实例化一个数据库操作类,在各个类中我只需要在入库的地方调用实例化接口,进行入库。
比较两者我们容易发现,后者较前者的改动性小,同时维护性也更高,可以将入库的操作集中在单例类中。
代码地址:http://download.youkuaiyun.com/detail/zerolxl/4604349
版权说明: 本代码版权 为 糙级码lee 所有
转载请注明来自:http://blog.youkuaiyun.com/zerolxl