设计模式(1) –单例模式(Singleton)

来源:互联网 发布:免费网络发布平台大全 编辑:程序博客网 时间:2024/05/29 09:02

首先,单例模式是对象的创建模式之一,单例模式的三个特点:

1,该类只有一个实例
2,该类自行创建该实例(在该类内部创建自身的实例对象)
3,向整个系统公开这个实例接口

        有人可能会问这样的方式可以用在哪里,哪里比较适合使用?举个例子,倚天剑只有一把,可能在张无忌手中 可能在杨逍手中当然也有可能在赵敏手中,如果我们将倚天剑设置为一个普通的类,那么就可能出现一个倚天剑重复实例化的情况,金庸的世界可不是咱这,山寨货那么多。。。 所以这个时候将倚天剑当做一个单例类就可以避免这样的情况出现。

       因此我们就可以设计出一个倚天剑的单例类:


头文件:

/*版权说明: 本代码版权 为 糙级码lee 所有转载请注明来自:http://blog.csdn.net/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.csdn.net/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.csdn.net/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.csdn.net/detail/zerolxl/4604349


                                                                                                                  版权说明: 本代码版权 为 糙级码lee 所有

                                                                                                              转载请注明来自:http://blog.csdn.net/zerolxl 


	
				
		
原创粉丝点击