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

原创 2001年07月31日 15:50:00

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

/* $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++中怎样实现是最优的。



 

C++单件模式的实现

单件模式:其实就是保证了一个类有且仅有一个对像,又提供一个全局访问方法。对某些类来说,希望它只有一个对像,那么用单件模式设计再好不过了。很多人在刚开始时不知道Ogre中getSingleton()、g...
  • fanwenyuan_fwy
  • fanwenyuan_fwy
  • 2014年08月08日 11:49
  • 518

C++ 单件模式实现及对象释放

单件模式: 单件模式即在整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享的。 单件模式的C++实现(构造函数、拷贝构造函数、赋值操作符均需重写): #include clas...
  • zxwangyun
  • zxwangyun
  • 2014年06月10日 13:52
  • 1549

Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现

  • 2013年04月10日 18:24
  • 1.59MB
  • 下载

单件模式的C++实现

单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享时的程序设计方法(根据实际情况,可能需要几个类实例)。在某些情况下,这种程序设计方法是很有用处的。 Sin...
  • luoluoxiaocainiao
  • luoluoxiaocainiao
  • 2014年02月26日 21:16
  • 1250

多线程安全的Singleton单件模式在C++,java与C#下的实现

单件模式就是全局只能被创建一个对象,在没有多线程的情况粗糙的代码还可以     class Singleton { private: static Singleton* Instanc...
  • XiaoPANGXia
  • XiaoPANGXia
  • 2015年04月18日 22:39
  • 1359

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

  单件模式有什么用处,请自行查阅相关书籍:/* $Log: E/VC/TEST/TESTCONSOLE/JYSINGLETON2.H $ * $Source: /ye/vc/test/testCon...
  • applex1122
  • applex1122
  • 2008年12月20日 18:30
  • 347

单件模式(Singleton Pattern)(一):单件模式介绍

一、意图          单件模式(又称单例模式)确保一个类只有一个实例,并提供一个全局访问点。 二、适用性 1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问...
  • jialinqiang
  • jialinqiang
  • 2013年05月11日 09:23
  • 4001

Singleton Pattern (单例or单件模式)的几种实现方式

单例模式的集中实现方式如下 1. 对性能不是很关键的应用程序中实现(经典模式) 由于 public static Singleton mInstance; public static syn...
  • u012846783
  • u012846783
  • 2016年08月19日 00:32
  • 558

关于C++单件模式释放对象

最近接触的一个项目要用到单件模式,我像往常一样哒哒(敲击键盘ing)一个单件模式的典型结构很快就出现在我的面前: class Singleton { public: ~Singleton(){} st...
  • windboyzsj
  • windboyzsj
  • 2008年08月18日 16:57
  • 6810

【设计模式】学习笔记7:单件模式(Singleton)

走进单件模式 有些对象我们只需要一个,比如:线程池,缓存,对话框,处理偏好设置和注册表的对象,日志对象,充当打印机,显卡等设备的驱动程序对象等。 这些类的对象只能有一个实例,如果有多个,然而会导致许...
  • shuangde800
  • shuangde800
  • 2013年08月10日 00:49
  • 2253
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单件模式的C++模板实现
举报原因:
原因补充:

(最多只允许输入30个字)