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模式给和盘托出了,欲知后事如何,须听下回分解。