设计模式那些事儿之笑谈Singleton模式

1       前言

朦胧岁月里曾听前辈说过设计模式,却不知为何物。也曾打算花点时间看看设计模式,少去几次KTV,保龄球馆……毕竟繁华过尽,沧桑尽显。时光匆匆催人老,唯有知识让人老当益壮。在学计算机课程的时候,书上那么写,老师也那么说,程序=数据结构+算法。这一点我必须认同,打心底的认同。不过,我还想再说句,软件,特别是上层应用软件,其灵魂是设计模式。打个比方,如果说软件是三国时期的蜀国,数据结构和算法就是桃园三结义中的关羽和张飞,设计模式便是诸葛孔明,蜀国的宏伟蓝图就是他三分天下分出来的,而你当之无愧便是刘备了哦,呵呵。刘备三顾茅庐聘请诸葛亮出山,诸葛亮充分调度关张二人,终究三分天下,建立蜀国。这算是比较理想的情况了,如果当初刘备不是三顾茅庐,而是三顾瓦房、楼房,请了蒋干或者诸葛亮他哥,那就糟糕了,纵使关张二人有三头六臂,能飞檐走壁,所到之处刀削如泥,那也无力回天,为之奈何……软件其实也一样,架构的不好,就算是用再精致的数据结构,再巧妙的算法,那也是徒劳。痛定思痛后,终归还得踏上重构之路,你以为重构容易么?还得回到设计模式上。

架构师这条路不好走,我却打算在上面走一段时间。在Neusoft时,我曾问大师,设计模式如何学,他说先看,把这些模式都记下来,然后再看看人家的代码,自己试着去实践,日子久了,就明白其中的道理。我想也是的,那好,我就沿着这条路走下去吧,我选择步行。步行有步行的好处,骑车有骑车的好处;步行呢,路边的风景和MM可以一览无余;骑车呢,飕飕的飘过,很潇洒,很拉风,路边的MM都在看你……

1.1    Singleton模式

废话不多说了,言归正传,开始看设计模式吧。刚入门,拣个简单的看,从创建对象开始吧。BOSS后台代码也看了段时间了,也发现里面有些东西还是可以挑出来聊一聊的。

先看看书上都怎么说Singleton模式的吧。

1.1.1   模式介绍

作用:作用:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

 

 

 

 

 

 

 

 


解析:

Singleton模式其实是对全局静态变量的一个取代策略,上面提到的Singleton模式的两个作用在C++中是通过如下的机制实现的:

1.  仅有一个实例,提供一个类的静态成员变量,大家知道类的静态成员变量对于一个类的所有对象而言是惟一的;

2.  提供一个访问它的全局访问点,也就是提供对应的访问这个静态成员变量的静态成员函数,对类的所有对象而言也是惟一的.C++,可以直接使用类域进行访问而不必初始化一个类的对象。

下面的实现其实是Singleton的一个简单实现,并不是特别的通用。一般的,如果一个项目中需要使用到Singleton模式比较多的话,那么一般会实现一个Singleton的模板类,模板类的模板参数是需要采用Singleton模式的类,比如这样实现:

template<typename T>

class Singleton

{

// .类的声明

};

// 需要采用singleton模式的类

class Test

: public Singleton<Test>

{

// 类的声明

};

 

但是,下面的实现还是采用最简单的实现办法,起的是演示的作用。

实现:

1)Singleton.h

/*************************************************************

created: 2009/09/05

filename: Singleton.h

author: Niger

history:

description: Singleton 模式的学习

*************************************************************/

#ifndef __SINGLETON_H__

#define __SINGLETON_H__

class CSingleton

{

public:

CSingleton (){};

~ CSingleton (){};

// 静态成员函数,提供全局访问的接口

static CSingleton * GetInstancePtr();

static CSingleton GetInstance();

void SingletonTest();

private:

// 静态成员变量,提供全局惟一的一个实例

static CSingleton * m_pStatic;

};

#endif /*__SINGLETON_H__*/

2)Singleton.cpp

/*************************************************************

created: 2009/09/05

filename: Singleton.cpp

author: Niger

history:

description: Singleton 模式的学习

*************************************************************/

#include "Singleton.h"

#include <iostream>

// 类的静态成员变量要在类体外进行定义

CSingleton * CSingleton::m_pStatic = NULL;

CSingleton * CSingleton::GetInstancePtr()

{

if (NULL == m_pStatic)

{

m_pStatic = new CSingleton ();

}

return m_pStatic;

}

Singleton CSingleton::GetInstance()

{

return *GetInstancePtr();

}

void CSingleton:: SingletonTest ()

{

std::cout << " SingletonTest!/n";

}

 

3)Main.cpp

/*************************************************************

created: 2009/09/05

filename: Main.cpp

author: Niger

history:

description: Singleton 模式的学习

*************************************************************/

#include "Singleton.h"

#include <stdlib.h>

int main()

{

// 不用初始化类对象就可以访问了

Singleton::GetInstancePtr()->SingletonTest ();

Singleton::GetInstance().SingletonTest ();

 

system("pause");

 

return 0;

}

 

1.1.2   BOSS中的Singleton

上面的理论和实例代码,已经揭开了Singleton模式的神秘面纱,相信大家都知晓Singleton模式为何许人也了。下面我就打算拿BOSS中的一小段代码来聊聊了。任何人如发现任何地方的说法或者修饰不正确、不恰当,请举砖拍之。

对于Singleton模式,我决定以一个中心两个基本点为主线,采用总分叙述的方式来书写它不老的传奇。

一个中心就是,在某个局部范围内,获取对象唯一实例。其实这也正是实现Singleton模式的核心代码。这里只是贴出与Singleton相关的关键代码,其他部分都飘过,因为他们干的是与我关心的事没有关系:

CDictAgent* CDictAgent::GetInstance(……)

{

……

if( CDictAgent::instance == 0 ){    

         CDictAgent::instance = new CDictAgent();

}else{

         //do other important things

}

return CDictAgent::instance;

}

这个if语句啊,始终抱着一颗拳拳的心,不厌其烦的在念着[无则加勉,有则改之]。无论何时路过这地儿,都能听到他在这样唠叨着。

两个基本点就是:1)静态变量instance。它在类中被声明为static的,static意味着对于该类的所有对象来说,它们共享instance所占的这块内存,她啊并不属于谁的谁。在这一点上,C++为我们提供了强有力的技术支持。2)静态函数GetInstance()。既然静态变量不属于我也不属于他,那我想约她出来见个面或者吃饭什么的,该怎么办呢?C++给我们关上了这扇门,同时也给我们开启了另外一扇窗:使用静态函数访问静态变量。透过这扇窗,我们照样能看的很真实,眼中的那个她没有变样。不要以任何理由怀疑这是个替身,是真人,她比成龙还成龙,从来不找替身的。

至此,我就把我所知道的Singleton模式给和盘托出了,欲知后事如何,须听下回分解。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值