Singleton模式(C++)

转载 2011年01月18日 09:53:00

转自http://www.cppblog.com/zmllegtui/archive/2008/10/27/65252.html

 

 

    

    将构造函数设计成 protected 的目的是防止在 class 外面 new ,有人可能会设计成 private ,假如考虑到有可能会继续这个类的话,还是将构造函数设计成 protected 比较好,还需要加一个 virtual 析构函数。为了防止别人复制 Singleton 对象:

Singleton* pSingleton = Singleton::Instance();

Singleton s1 = *pSingleton;

Singleton s2 = *pSingleton;

需要将拷贝构造 (copy constrUCtor) 函数变成 private

    但是这里存在的问题是,什么时候删除 Singleton 对象?按照 C++ 的一个基本原则,对象在哪里创建就在哪里销毁,这里还应该放一个 destroy 方法来删除 Singleton 对象。假如忘了删除就比较麻烦。 Instance 函数还存在多线程同时访问的加锁问题。假如把 Instance 函数开始和结尾放上加锁和解锁,整个函数性能会下降很多。这不是一个好的设计。

    有一个小小的改动,可以避免忘了删除 Singleton 对象带来内存泄露的问题。那就是用 std:auto_ptr 来包含 Singleton 对象 , 定义一个 class static member auto_ptr 对象,在析构的静态 auto_ptr 变量的时候时候自动删除 Singleton 对象。为了不让用户 delete Singleton 对象,需要将析构函数由 public 变成 protected

 

 

    写一个 C++ 中的 Singleton 需要这么费劲,大大出乎我们的意料。有很多人从未用过 auto_ptr ,而且 std:auto_ptr 本身就并不完美,它是基于对象所有权机制的,相比之下, Apache Log4cxx 中有一个 auto_ptr, 是基于对象计数的,更为好用。只是为了用一个好的 auto_ptr 而不得不用 log4cxx , 对于很多项目来说,也不太好。当然了, ANSI C++ STL std:auto_ptr 对于写上面的例子已经足够用了。      另外一个思路是,把 GetInstance 函数设计成 static member 可能更好,因为一般来说, Singleton 对象都不大, static member 虽然必须一直占用内存,问题不大。这里的析构函数必须设成 public 了。  

从代码量来说,似乎使用 static member ref 更为简单。我更偏向于用这种方法。

    但是,并不是所有情况下面都适合用 static member singleton 。比如说, GetInstance 需要动态决定返回不同的 instance 的时候,就不能用。举例来说, FileSystem::GetInstance, windows 下面运行可能需要返回 new WinFileSystem, Linux/Unix 下面运行可能需要返回 new LinuxFileSystem ,这个时候还是需要用上面的 auto_ptr 包含 singleton 指针的方法。

C++中实现singleton(单例模式)的最简单写法

前几天看了 Java中实现singleton的写法,就想在C++中实现一下,找了很多资料,看了各个牛人写的不同版本,但最后在stack overflow上找到了一个最简单的写法,现在贴出来以供参考: ...
  • flybird19870326
  • flybird19870326
  • 2014年03月04日 16:50
  • 1979

C++中实现Singleton的正确方法

原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明,否则将追究法律责任。http://blog.csdn.net/hzliyun/article/details/7178...
  • hzliyun
  • hzliyun
  • 2012年01月05日 17:14
  • 3308

c++--Singleton单例模式的实现

1.线程安全的懒汉单例模式 懒汉式的特点是延迟加载,比如配置文件,采用懒汉式的方法,顾名思义,懒汉么,很懒的,配置文件的实例直到用到的时候才会加载。。。。。。class Singleton{ pu...
  • qq_30968657
  • qq_30968657
  • 2017年04月05日 16:25
  • 218

singleton模式的几种实现方式

一、最简单的方式 public static Singleton getInstance() { if (instance == null) { instance = new...
  • lxgwm2008
  • lxgwm2008
  • 2012年07月02日 22:17
  • 3565

写一个Singleton模式的例子

public class Singleton{  private static Singleton single = new Singleton();  private Singleton(){}  ...
  • owenliu563
  • owenliu563
  • 2014年03月08日 13:18
  • 929

[Java设计模式](一)怎样实现Singleton(单例)模式编程

单例模式是开发模式中最简单,最易于理解的一种模式。简单地说,它指的就是始终保持一个实例的意思。但是,Java的类是可以穿件多个实例的,那么,怎么实现呢? 顾名思义,单例模式就是只有一个实例。单例模式确...
  • u012942818
  • u012942818
  • 2015年03月30日 15:20
  • 1132

javascript设计模式-singleton(单例)模式

singleton(单例)模式被熟知的原因是因为它限制了类的实例化次数只能一次,单例模式,在该实例不存在的勤快下,可以通过一个方法创建一个类来实现创建类的新实例;如果实例已经存在,则会简单返回该对象的...
  • yilanyoumeng3
  • yilanyoumeng3
  • 2016年08月22日 14:38
  • 722

C++ Singleton模式之线程安全

转自: http://blog.csdn.net/insistgogo/article/details/9412863 定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程...
  • nodeathphoenix
  • nodeathphoenix
  • 2016年06月13日 15:09
  • 777

实现Singleton 模式——七种实现方式

题目:设计一个类,我们只能生成该类的一个实例 [java] view plaincopyprint? public class Test02 {        /**   ...
  • judyge
  • judyge
  • 2015年05月03日 18:29
  • 355

【Singleton】单例模式及常见的6种写法—宁可饥饿也不偷懒

单例模式大家并不陌生,分为懒汉式、饿汉式之类的。它们是有些细微的不同,下面就一点一点告诉你们这俩汉子有嘛不同   下面是一个简单的小实例: //简单懒汉式 public class Singleton...
  • knockheart
  • knockheart
  • 2013年06月19日 11:46
  • 2878
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Singleton模式(C++)
举报原因:
原因补充:

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