模板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实现代码,测试可用。
#pragma once
/************************************************************************
singleton模式类模板
1:延迟创建类实例 2:double check 3:互斥访问 4:模板
************************************************************************/
#ifndef WHG_SINGLETON
#define WHG_SINGLETON #include "ThreadLockCs.h" template<class T>
class CSingleton
{
private:
static T* _instance;
CSingleton(void);
static CThreadLockCs lcs;
public:
static T* Instance(void);
static void Close(void);
}; //模板类static变量
template<class T>
T* CSingleton<T>::_instance = NULL; template<class T>
CThreadLockCs CSingleton<T>::lcs; //模板类方法实现
template<class T>
CSingleton<T>::CSingleton(void)
{
} template<class T>
T* CSingleton<T>::Instance(void)
{
//double-check
//延迟创建,只有调用方访问Instance才会创建类实例
if (_instance == NULL)
{
//互斥访问锁,用CriticalSection实现
lcs.lock();
if (_instance == NULL)
{
_instance = new T;
}
lcs.unlock();
}
return _instance;
} template<class T>
void CSingleton<T>::Close(void)
{
if (_instance)
{
delete _instance;
}
} #endif
CSingleton内用到的CThreadLockCs 实现如下:
//互斥访问锁
#ifndef WHG_THREAD_LOCKCS
#define WHG_THREAD_LOCKCS //#include <Windows.h> class CThreadLockCs
{
public:
CThreadLockCs(){InitializeCriticalSection(&m_cs);}
~CThreadLockCs(){DeleteCriticalSection(&m_cs);}
void lock(){EnterCriticalSection(&m_cs);}
void unlock(){LeaveCriticalSection(&m_cs);}
private:
CRITICAL_SECTION m_cs;
};
#endif
调用方法很简单:
1:用typedef申明一个变量名
typedef CSingleton<CListen> LISTEN;
2:调用的地方写
LISTEN::Instance()->SetAddress(,"127.0.0.1");
3:关闭的地方写
LISTEN::Close();
模板singleton模式的C++实现的更多相关文章
- C++ Singleton模式
地址:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却 ...
- 【设计模式】Singleton模式C++实现
Singleton是设计模式中比较简单的一个.园中的朋友们应该都很熟悉了.前段时间参加xxx外企的面试,和面试官讨论C++的时候正好写了一个.当时由于在有些地方考虑不太周全,代码出现了一些疏漏.不过最 ...
- Singleton模式C++实现
Singleton模式C++实现 Singleton是设计模式中比较简单的一个.园中的朋友们应该都很熟悉了.前段时间参加xxx外企的面试,和面试官讨论C++的时候正好写了一个.当时由于在有些地方考虑不 ...
- Java设计模式(2)单态模式(Singleton模式)
定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化 ...
- C++完美实现Singleton模式[转]
Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却也不是件容易的事情.1. 标准的实现class Singleton{public: static Singleton * ...
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- 剑指Offer面试题:1.实现Singleton模式
说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...
- Singleton模式——对象创建型模式
Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...
- Singleton模式和Mono-State模式
类和实例 对于大多数的类,都可以创建多个实例.在需要和不需要时,创建和删除这些实例.该过程会伴随着内存的分配和归还. 同时,有一些类,应该仅有一个实例.该实例在程序启动/结束时被创建和删除. root ...
随机推荐
- layer1.8UI
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- The Key to final data
// FinalData.java - (insert one line description here) package com.hp.ci.mgmt.perm.hal.localization; ...
- React Route
有幸你能看来我的这篇文章,这篇文章是继React后面写的Reactroute,所以你需要看看我前面整理的React笔记再来看Reactroute可能更容易 All the work we've don ...
- 共享AFHTTPSessionManager 单例好处浅析
很多时候,AFNetworking都是目前iOS开发者网络库中的不二选择.Github上2W+的star数足见其流行程度.而从iOS7.0开始,苹果推出了新的网络库继承者NSURLSession后 ...
- 分布式版本控制系统Git-----8.fst-forward与no fast foward
当前分支合并到另一分支时,如果没有分歧解决,就会直接移动文件指针.这个过程叫做fastforward. 举例来说,开发一直在master分支进行,但忽然有一个新的想法,于是新建了一个develop的分 ...
- Linux服务器时间设置命令
hwclock -r # 读取BIOS 时间 hwclock -w # 将当前系统时间写入BIOS date -s 2010/10/02 # 设置年月日 date -s 15: ...
- java中字符串的操作
//创建一个字符数组 char[] charArr = {'a','b','c','d','e','f','g'}; //创建一个字符串 String str = new String(charArr ...
- 《JS权威指南学习总结--8.4 作为值的函数》
内容要点: 函数可以定义,也可以调用,这是函数最重要的特性.函数定义和调用是JS的词法特性,对于其他大多数编程语言来说也是如此.然而在JS中,函数不仅仅是一种语法,也是值,也就是说,可以将函数赋值 ...
- mysql去重的最方便的两种方法
参考资料:http://blog.csdn.net/guocuifang655/article/details/3993612 方法一: 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然m ...
- java中三大修饰符
一.static 1.属性:类变量 定义在类以内,方法以外,全类有效,全类公共一个属性 类变量与创建对象无关,有默认值0 使用方式 类名.类变量 System.out.println(); ...