- 浏览: 990462 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
Singleton
模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却也不是件容易的事情。
1.
标准的实现
class
Singleton
{
public:
static
Singleton *
Instance()
{
if(
0
==
_instance)
{
_instance =
new
Singleton;
}
return
_instance;
}
protected:
Singleton(void)
{
}
virtual
~
Singleton(void)
{
}
static
Singleton* _instance;
};
这是教科书上使用的方法。看起来没有什么问题,其实包含很多的问题。下面我们一个一个的解决。
2.
自动垃圾回收
上面的程序必须记住在程序结束的时候,释放内存。为了让它自动的释放内存,我们引入
auto_ptr
改变它。
#include
<memory>
#include
<iostream>
using
namespace
std;
class
Singleton
{
public:
static
Singleton *
Instance()
{
if(
0
==
_instance.
get())
{
_instance.
reset(
new
Singleton);
}
return
_instance.
get();
}
protected:
Singleton(void)
{
cout <<
"Create Singleton"
<<
endl;
}
virtual
~
Singleton(void)
{
cout <<
"Destroy Singleton"
<<
endl;
}
friend
class
auto_ptr<
Singleton>;
static
auto_ptr<
Singleton>
_instance;
};
//Singleton.cpp
auto_ptr<
Singleton>
Singleton::
_instance;
3.
增加模板
在我的一个工程中,有多个的
Singleton
类,对
Singleton
类,我都要实现上面这一切,这让我觉得烦死了。于是我想到了模板来完成这些重复的工作。
现在我们要添加本文中最吸引人单件实现:
/********************************************************************
(c) 2003-2005 C2217 Studio
Module:
Singleton.h
Author:
Yangjun D.
Created:
9/3/2005
23:17
Purpose:
Implement singleton pattern
History:
*********************************************************************/
#pragma
once
#include
<memory>
using
namespace
std;
using
namespace
C2217::
Win32;
namespace
C2217
{
namespace
Pattern
{
template
<class
T>
class
Singleton
{
public:
static
inline
T*
instance();
private:
Singleton(void){}
~
Singleton(void){}
Singleton(const
Singleton&){}
Singleton &
operator=
(const
Singleton &){}
static
auto_ptr<
T>
_instance;
};
template
<class
T>
auto_ptr<
T>
Singleton<
T>::
_instance;
template
<class
T>
inline
T*
Singleton<
T>::
instance()
{
if(
0
==
_instance.
get())
{
_instance.
reset (
new
T);
}
return
_instance.
get();
}
//Class that will implement the singleton mode,
//must use the macro in it's delare file
#define
DECLARE_SINGLETON_CLASS(
type )
\
friend
class
auto_ptr<
type >;
\
friend
class
Singleton<
type >;
}
}
4.
线程安全
上面的程序可以适应单线程的程序。但是如果把它用到多线程的程序就会发生问题。主要的问题在于同时执行
_instance.
reset (
new
T);
就会同时产生两个新的对象,然后马上释放一个,这跟
Singleton
模式的本意不符。所以,你需要更加安全的版本:
/********************************************************************
(c) 2003-2005 C2217 Studio
Module:
Singleton.h
Author:
Yangjun D.
Created:
9/3/2005
23:17
Purpose:
Implement singleton pattern
History:
*********************************************************************/
#pragma
once
#include
<memory>
using
namespace
std;
#include
"Interlocked.h"
using
namespace
C2217::
Win32;
namespace
C2217
{
namespace
Pattern
{
template
<class
T>
class
Singleton
{
public:
static
inline
T*
instance();
private:
Singleton(void){}
~
Singleton(void){}
Singleton(const
Singleton&){}
Singleton &
operator=
(const
Singleton &){}
static
auto_ptr<
T>
_instance;
static
CResGuard _rs;
};
template
<class
T>
auto_ptr<
T>
Singleton<
T>::
_instance;
template
<class
T>
CResGuard Singleton<
T>::
_rs;
template
<class
T>
inline
T*
Singleton<
T>::
instance()
{
if(
0
==
_instance.
get()
)
{
CResGuard::
CGuard gd(
_rs);
if(
0
==
_instance.
get())
{
_instance.
reset (
new
T);
}
}
return
_instance.
get();
}
//Class that will implement the singleton mode,
//must use the macro in it's delare file
#define
DECLARE_SINGLETON_CLASS(
type )
\
friend
class
auto_ptr<
type >;
\
friend
class
Singleton<
type >;
}
}
CresGuard
类主要的功能是线程访问同步
,
代码如下:
/******************************************************************************
Module:
Interlocked.h
Notices: Copyright (c) 2000 Jeffrey Richter
******************************************************************************/
#pragma
once
///////////////////////////////////////////////////////////////////////////////
// Instances of this class will be accessed by multiple threads. So,
// all members of this class (except the constructor and destructor)
// must be thread-safe.
class
CResGuard {
public:
CResGuard()
{
m_lGrdCnt =
0
;
InitializeCriticalSection(&
m_cs);
}
~
CResGuard()
{
DeleteCriticalSection(&
m_cs);
}
// IsGuarded is used for debugging
BOOL IsGuarded()
const
{
return(
m_lGrdCnt >
0
);
}
public:
class
CGuard {
public:
CGuard(
CResGuard&
rg)
:
m_rg(
rg)
{
m_rg.
Guard();
};
~
CGuard()
{
m_rg.
Unguard();
}
private:
CResGuard&
m_rg;
};
private:
void
Guard()
{
EnterCriticalSection(&
m_cs);
m_lGrdCnt++;
}
void
Unguard()
{
m_lGrdCnt--;
LeaveCriticalSection(&
m_cs);
}
// Guard/Unguard can only be accessed by the nested CGuard class.
friend
class
CResGuard::
CGuard;
private:
CRITICAL_SECTION m_cs;
long
m_lGrdCnt;
// # of EnterCriticalSection calls
};
///////////////////////////////////////////////////////////////////////////////
5.
实用方法
比如你有一个需要实现单件模式的类,就应该这样实现:
#pragma
once
#include
"singleton.h"
using
namespace
C2217::
Pattern;
class
ServiceManger
{
public:
void
Run()
{
}
private:
ServiceManger(void)
{
}
virtual
~
ServiceManger(void)
{
}
DECLARE_SINGLETON_CLASS(
ServiceManger);
};
typedef
Singleton<
ServiceManger>
SSManger;
在使用的时候很简单,跟一般的
Singleton
实现的方法没有什么不同。
int
_tmain(int
argc,
_TCHAR*
argv[])
{
SSManger::
instance()->
Run();
}
一个简单的
Singleton
模式的实现,可以看到
C++
语言背后隐藏的丰富的语意,我希望有人能实现一个更好的
Singleton
让大家学习。我从一开始实现
Singleton
类的过程,其实就是我学习
C++
的过程,越是深入越觉得
C++
了不起。
posted on 2005-09-20 22:14 天下无双
阅读(18400) 评论(30)
编辑
收藏
引用
所属分类: C/C++
发表评论
-
NotePad++ - 安装和配置C/C++开发插件
2011-11-15 23:00 1783NotePad++ - 安装和配置C/C+ ... -
VC中使用ATL编写控件 【转】
2011-10-21 15:23 2113VC中使用ATL编写控件 作者:邵盛松 2010 ... -
在Windows环境下MongoDB搭建和简单操作【转】
2011-10-21 12:37 947一,安装mongoDB 1,解 ... -
Mongodb在Windows下安装及配置【转】
2011-10-21 12:35 5591.下载mongodb的windows版本,有32位和64位版 ... -
一篇介绍VC开发OCX的文章[转]
2011-10-20 17:57 1865转自“http://www.cnblogs.com/genga ... -
使你的ActiveX控件执行时不弹出安全性提示 (转载)
2011-10-20 17:56 1173使你的ActiveX控件执行时不弹出安全性提示 2010-0 ... -
VC++ 的MFC 和ATL 及COM 是什么?
2011-10-20 01:12 997一、什么是MFC 微软基础类(Micro ... -
使用ATL编写一个简单的COM服务器【转】
2011-10-20 01:10 873下载例子代码 本文的对象是COM编程 ... -
使用VC++6.0制作ASP服务器控件简介[转]
2011-10-20 01:10 674用ASP写网页的程序 员,一定对VBSript语句“Set ... -
基于CentOS 5.4搭建nginx+php+spawn-fcgi+mysql
2011-09-01 13:49 1534基于CentOS 5.4搭建nginx+php+sp ... -
解决mrtg的Use of uninitialized value in hash element at /usr/bin/indexmaker line 35
2011-09-01 13:41 2315mrtg的安装过程这里就不再阐述,随便搜索一下。使用ind ... -
用MRTG检测Linux网络性能
2011-09-01 10:49 877随着Linux应用的日益广泛,有大量的网络服务器使用Linux ... -
Linux安装配置maven3.0以及搭建nexus私服
2011-08-30 23:45 1633一、软件准备 1、apache-maven-3.0-b ... -
GraphicsMagick介绍及安装
2011-08-30 23:16 1541作者:Cocowool 来源:博客园 发布时 ... -
Makefile
2011-08-30 22:10 874CC = g++ CFLAG = -Wall -g -w ... -
高位字节优先 低位字节优先
2011-08-24 17:30 1170自第一台计算机诞生, ... -
C++方式的文件操作
2011-08-24 16:05 1826本文主要讨论C++标准I/O库,主要内容为控制台输入输出流 ... -
【JAVA实用工具】JNA-通过它调用C++的方法,比JNI方便很多访问网站需要代理,所以把它COPY出来备忘
2011-08-24 00:33 3123How To Get Started Using JN ... -
Jni中C++和Java的参数传递
2011-08-24 00:04 5130如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对 ... -
aaaaa
2011-08-24 00:04 1005如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对 ...
相关推荐
用VC实现的singleton 模式 在VS03,VC6.0下编译通过
本文档,是利用C++来实现设计模式中的,单例模式,里面有内容说明和相关实例代码介绍
双重检测锁(Double-Checked Locking)实现的Singleton模式在多线程应用中有相当的价值。在ACE的实现中就大量使用ACE_Singleton模板类将普通类转换成具有Singleton行为的类。这种方式很好地消除了一些重复代码臭味,...
设计模式C++学习之单例模式(Singleton)
Java的Singleton模式代码(免资源分),你会发现Java的Singleton模式真的很有趣,原来程序还可以这样写。
c++ singleton单例模式
如果某个类管理了系统中的某种资源,那么我们只能创建该类的一个实例,此时用到singleton设计模式(后面为了简化将省略“设计模式”四个字)比较合适了。然而,如果不注意实现方法,很有可能会让我们碰到一些...
Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现
Singleton模式: 确保一个类只有唯一的一个实例。 Singleton主要用于对象的创建,这意味着,如果某个类采用了Singleton模式,则在这个类被创建后,它将有且仅有一个实例可供访问。很多时候我们都会需要Singleton...
C++11实现线程安全的单例代码和测试代码,包含singleton.h,main.cpp,希望帮助到大家。
常见设计模式的解析和实现(C++),真的很经典,我也在学 常见设计模式的解析和实现(C++)之一-Factory模式 常见设计模式的解析和实现(C++)之二-Abstract ...常见设计模式的解析和实现(C++)之五-Singleton模式 .........
C++设计模式课件12_Singleton_单件模式.pdf
Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)
java singleton 不解释不解释不解释不解释
23种设计模式之三(创建型模式)Singleton模式
最简单的设计模式学习Singleton模式
很多开发人员在刚开始学Python 时,都考虑过像 c++ 那样来实现 singleton 模式,但后来会发现 c++ 是 c++,Python 是 Python,不能简单的进行模仿。 Python 中常见的方法是借助 global 变量,或者 class 变量来实现...
主要介绍了Python实现Singleton模式的方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下