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

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

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 



                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值