分享
 
 
 

单件模式的C++模板实现

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

单件模式有什么用处,请自行查阅相关书籍:

/* $Log: E/VC/TEST/TESTCONSOLE/JYSINGLETON2.H $

* $Source: /ye/vc/test/testConsole/jySingleton2.h

*/

//$//////////////////////////////////////////////////////////////

//$ jySingleton2.h

//$

//$ Author : "Jasper Yeh" <jasperyeh@21cn.com>

//$ Version : 1.00.000

//$ Create Time : Tuesday, July 31, 200113:59

//$ Time-stamp : <Tuesday, July 31, 2001 13:59 jy>

//$ Descriptions: (jySingleton2.h 文件的功能描述)

//$

//$++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//$ If this code works, it was written by Jasper Yeh.

//$ If not, I don't know who wrote it.

//$

//$ Okay, the source code is released for free distribution

//$ under the terms of the GNU Lesser GPL License.

//$ Lesser GPL is specially at you can reserve your changes

//$ on this file(s), no public necessary, but you could be

//$ pleasure to notify me by mail.

//$ Go to http://www.gnu.org/copyleft/lesser.html for LGPL

//$

//$//////////////////////////////////////////////////////////////

#ifndef __JYSINGLETON2_H

#define __JYSINGLETON2_H

#include <memory>

#if !defined(JYTRACE)

#if defined(_CONSOLE)

#define JYTRACE _tprintf

#elif defined(_MFC_VER)

#define JYTRACE TRACE

#else

#define JYTRACE

#endif

#endif

//仍然是一个不算完满的C++解决,但是终于将单件模板化了。

//

//这里用到的原理是动态中的动态构造模板类的静态成员变量技术:

// 1. 模板的代码是在第一次实例化时动态产生的;

// 2. 模板类自身的名称的确定也是在第一次实例化时真正具有意义;

// 3. 将模板类的静态成员变量放入成员函数体内,解决了放在模板类中声明的尴尬。

//例如,这样的代码将会很难使用

// template <class T>

// class SG {

// public:

// SG(){}

// ~SG(){}

// static std::auto_ptr<T> _Tdata;

// };

//类似的情况主要发生于:

//a. 一个静态成员变量

//b. 该变量的构造依赖于传递来的参数化类名称(即T)

//凡是符合上述情况的,都会遇到无法书写该静态变量的实现语句的难题。

//例如上例中,为了使用SG模板类,你不得不这样写:

// class YY;

// typedef SG<YY> SGYY;

// std::auto_ptr<YY> SGYY::_Tdata;//horrible!!

// SGYY* someptr = new SGYY;

//其中,YY是一个已经定义的类。

//注意这和标准的模板的用法是有区别的:如果你需要模板化第二个类,你还需要这样写:

// class ZZ;

// typedef SG<ZZ> SGZZ;

// std::auto_ptr<ZZ> SGZZ::_Tdata;//horrible!!

// SGZZ* someptr = new SGZZ;

//考察上面两段代码的第二句,你可能已经明白问题出在什么地方了。是的,每当需要

//参数化一个类的时候,你需要手工的为这个类制作一个模板类SG的静态成员变量的声

//明。

//如果你不在意这么一句话的开销,可以采用上述的示例,它们已经被证明是有效的。

//但是如果你对于封装的意义感到更为重要,或者你的模板类需要多个静态变量的时候,

//可能需要参考下面的实现。

//

//这种实现被典型的运用在单件模式上,尤其重要的是,要想利用这种办法,你的模板类

//将会是单件式样的。

//通过修改

// static std::auto_ptr<jySingletonContainer> _Container; //

//的声明和具体实现语句,你实际上可以跳脱上述限制,从而允许容器中能够容纳多个实

//例(例如,将它声明成一个简单的链表)。

//自然,Instance()函数本身的声明也需要调整以适应多个实例的情况。

//

//由于模板类这时候的功能已经演变为包容一个或者多个参数类的指针了,因此,我们使

//用了jySingletnContainer这样的名字,以便强调一下他的容器特性。

//

//顺便一提,auto_ptr<jySingleton<T>> _Container;的语法是不容易通过的。

template <class T>

class jySingleton{

//为了运用jySingleton<T>,你需要:

// 不能从参数类直接构造其实例,只能通过jySingleton<T>::Instance()来取得和

//运用参数类的的实例。标准实例如下:

// class YY;

// typedef jySIngleton<YY> CYY;

// YY* pyy = *CYY::Instance();//灵巧指针机制使得CYY的实例指针不必被关注

jySingleton(){

_Ptr = NULL;

JYTRACE(_T("jySingleton<T> class initializing at %p\n"), this);

}

public:

~jySingleton(){

release();

JYTRACE(_T("jySingleton<T> class at %p deconstructing\n"), this);

}

public:

typedef jySingleton<T> jySingletonContainer;

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

//只能使用这个接口来获取T的实例的指针

//至于jySingleton<T>容器类自身的那个唯一实例的指针,反而不必再予

//以考虑了。

static jySingleton<T>* Instance(){

//

//singleton class me (i.e. jySingleton<T>)

//Error syntax:

// static std::auto_ptr<jySingleton<T>> _Container;

//

static std::auto_ptr<jySingletonContainer> _Container;

if(_Container.get()==NULL){

jySingletonContainer* sg = new jySingletonContainer();

sg->_Ptr = new T;

_Container = std::auto_ptr<jySingletonContainer>(sg);

}

return _Container.get();

}

public:

operator T*(){ return get(); }

T* operator ->() {return get(); }

T& operator *() {return *get();}

T* get(){ return _Ptr; }

void release(){

if(_Ptr){delete _Ptr;_Ptr=NULL;}

}

T* detach(){ T* p=_Ptr;_Ptr=NULL; return p; }

private:

T* _Ptr; //T类的一个工作副本,以便客户能够使用。无论那种情况,一个副本。

};

#endif //__JYSINGLETON2_H

下一篇文章将讲述传统的单件在C++中怎样实现是最优的。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有