模板singleton模式的C++实现

模板singleton模式的C++实现

  近期回过头整理了一下singleton模式,看了别人写的关于singleton的介绍。发现这个singleton模式虽然简单,但要写一个稳定/线程安全/泛型的模板singleton,还是需要一点技巧的。经过整理,要写一个模板的singlton至少需要以下几个知识点:

1:singleton

2:static类成员实例延迟创建。

3:static类实例创建互斥实现,即线程安全。

4:double check技巧。  【Ref:http://www.ibm.com/developerworks/library/j-dcl/index.html】

5:模板。

6:static成员变量初始化。

7:singleton关闭类实例

下面上singleton实现代码,测试可用。

 1 #pragma once
 2 /************************************************************************
 3 singleton模式类模板
 4 1:延迟创建类实例    2:double check    3:互斥访问    4:模板
 5 ************************************************************************/
 6 #ifndef WHG_SINGLETON
 7 #define WHG_SINGLETON
 8
 9 #include "ThreadLockCs.h"
10
11 template<class T>
12 class CSingleton
13 {
14 private:
15     static T* _instance;
16     CSingleton(void);
17     static CThreadLockCs lcs;
18 public:
19     static T* Instance(void);
20     static void Close(void);
21 };
22
23 //模板类static变量
24 template<class T>
25 T*  CSingleton<T>::_instance = NULL;
26
27 template<class T>
28 CThreadLockCs CSingleton<T>::lcs;
29
30 //模板类方法实现
31 template<class T>
32 CSingleton<T>::CSingleton(void)
33 {
34 }
35
36 template<class T>
37 T*  CSingleton<T>::Instance(void)
38 {
39     //double-check
40     //延迟创建,只有调用方访问Instance才会创建类实例
41     if (_instance == NULL)
42     {
43         //互斥访问锁,用CriticalSection实现
44         lcs.lock();
45         if (_instance == NULL)
46         {
47             _instance = new T;
48         }
49         lcs.unlock();
50     }
51     return _instance;
52 }
53
54 template<class T>
55 void CSingleton<T>::Close(void)
56 {
57     if (_instance)
58     {
59         delete _instance;
60     }
61 }
62
63 #endif

CSingleton内用到的CThreadLockCs 实现如下:

 1 //互斥访问锁
 2 #ifndef WHG_THREAD_LOCKCS
 3 #define WHG_THREAD_LOCKCS
 4
 5 //#include <Windows.h>
 6
 7 class CThreadLockCs
 8 {
 9 public:
10     CThreadLockCs(){InitializeCriticalSection(&m_cs);}
11     ~CThreadLockCs(){DeleteCriticalSection(&m_cs);}
12     void lock(){EnterCriticalSection(&m_cs);}
13     void unlock(){LeaveCriticalSection(&m_cs);}
14 private:
15     CRITICAL_SECTION m_cs;
16 };
17 #endif

调用方法很简单:

1:用typedef申明一个变量名

1 typedef CSingleton<CListen>    LISTEN;

2:调用的地方写

1 LISTEN::Instance()->SetAddress(8828,"127.0.0.1");

3:关闭的地方写

1 LISTEN::Close();
时间: 2024-11-05 21:43:43

模板singleton模式的C++实现的相关文章

两种用于派生的Singleton模式(以TextureMgr为例)

Singleton,顾名思义,从字面上来理解就是单例模式,这是C++程序中 常用到的一种设计模式,特别是像文件管理器,纹理管理器这种整个软件 中只需要唯一的实例来管理所有资源时,这种模式的价值便得以体现. 下面来介绍两种用于派生管理的Singleton模式: 其中,第一种是Gof版本的Singleton, 其代码如下: //[Singleton_Gof.h] #pragma once template<typename T> class Singleton_Gof { protected: s

设计模式--singleton模式

使用单件模式的意图是保证一个类只有一个实例,并提供一个访问它的全局访问点. 将单件定义为全局或静态对象,然后依赖于自动的初始化,并不能完全实现上述意图.虽然可以提供全局访问点,但这是不够的.原因如下: 1)我们不能保证静态对象只有一个实例会被声明. 2)我们可能没有足够信息在静态初始化时实例化每个单件,单件可能需要在程序运行中稍后被计算出来的值. 3)c++没有定义转换单元上全局对象的构造器的调用顺序.这意味着单件之间不存在依赖关系:如果有,那么错误将是不可避免的. 4)使用全局或静态对象的实现

Java单态模式(Singleton模式)

定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化:这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到. 另外方面,Singleton也能够

剑指offer (2) c++实现singleton模式

转自:http://www.jellythink.com/archives/82 问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能:在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志.那么,如何构造一个日志模块的实例呢?难道,每次new一个日志模块实例,写完日志,再delete,不要告诉我你是这么干的.在C++中,可以构造一个日志模块的全局变量,那么在任何地方就都可以用了,是的,不错.但是

C# 中的Singleton模式

一般写Singleton基本都是一下这个套路 class Singleton { public static Singleton instance; private Singleton() { } public static Singleton Getinstance() { if(instatnce == null) { instance = new Singleton(); } return instance; } } 但是今天学到一个C#独有的Singleton写法: class seal

C++设计模式实现--模板(Template)模式

一. 问题 在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的.Template提供了这种情况的一个实现框架. 二. 模式 Template 模式是采用继承的方式实现这一点:将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节. 三. 代码 [cpp] view plaincopy //抽象基类,实现了一个模板方法 class AbstractClass { pu

跟刺猬哥一起学习设计模式【Singleton模式】

设计模式的分类 从目的来看: 创建型模式:负责对象创建 结构性模式:处理类与对象间的组合 行为型模式:类与对象交互中的职责分配 从范围来看: 类模式处理类与子类的静态关系 对象模式处理对象间的动态关系 动机 在软件系统中,经常有这样的一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性以及良好的效率. 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例呢?其实这应该是类设计者的责任,而不是使用者的责任. 意图 保证一个类仅有一个实例,并提供一个该实例的全局访问点. 

设计模式:Registry of Singleton模式

原文地址:http://leihuang.org/2014/12/05/registry-of-singleton/ Creational 模式 物件的产生需要消耗系统资源,所以如何有效率的产生.管理 与操作物件,一直都是值得讨论的课题, Creational 模式即与物件的建立相关,在这个分类下的模式给出了一些指导原则及设计的方向.下面列举到的全属于Creational 模式 Simple Factory 模式 Abstract Factory 模式 Builder 模式 Factory Me

Objective-C的singleton模式

最近因为在ios应用开发中,考虑到一些公共方法的封装使用,就决定使用单例模式的写法了..不知道,Object-c中的单例模式的写法是否和java中的写法是否有所区别?于是阿堂从网上一搜,发现“ Objective-C的singleton模式 ”一文被很多人转载了,其主要内容如下 Apple官方建议 由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的问题,因此苹果官方建议使用以下方式来实现单态模式: static MyGizmoClass *sharedGizmoManage