单例模式的三种版本

0人阅读 评论(0) 收藏 举报
 //版本一:静态对象+嵌套类
 class Singleton {
 private:
	 class AutoRelease
	 {
	 public:
		 AutoRelease()
		 {
			 cout << "AutoRelease()" << endl;
		 }
		 ~AutoRelease()
		 {
			 cout << "~AutoRelease()" << endl;
			 if (_pInstance)
			 {
				 delete _pInstance;
			 }
		 }
	 };
 public:
	 static Singleton *getInstance()
	 {
		 if (NULL == _pInstance) {
			 _pInstance = new Singleton;
		 }
		 return _pInstance;
	 }
 private:
	 Singleton() { cout << "Singleton()" << endl; }
	 ~Singleton() { cout << "~Singleton()" << endl; }
 private:
	 static Singleton *_pInstance;
	 static AutoRelease _auto;
 };


 //懒汉式/饿汉式
 Singleton *Singleton::_pInstance = NULL;//懒加载
 Singleton *Singleton::_pInstance=getInstance();//饱汉式
 Singleton::AutoRelease Singleton::_auto;
 //版本二  atexit+饱汉式
 class Singleton1 {
	 static Singleton1 *getInstance() {
		 if (NULL == _pInstance)
		 {
			 _pInstance = new Singleton1;
			 atexit(destroy);
		 }
		 return _pInstance;
	 }
	 static void destroy()
	 {
		 if (_pInstance)
			 delete _pInstance;
	 }
 private:
	 static Singleton1 *_pInstance;
	 Singleton1() { cout << "Singleton1()" << endl; }
	 ~Singleton1() { cout << "~Singleton1()" << endl; }


 private:
	 static Singleton1 *_pInstance;
 };
 Singleton1 *Singleton1::_pInstance = getInstance();//饱汉式,可以保证线程是安全的
 //版本三:让单例类对象自动释放
//atexit+phtnread_once
 class Singleton2
 {
 public:
	 static Singleton2 *getInstance()
	 {//能保证多线程安全
		 pthread_once(&_once, init);
		 return _pInstance;
	 }


	 static void init()
	 {
		 _pInstance = new Singleton2;
		 atexit(destory);
	 }
	 
	 static void destory()
	 {
		 if (_pInstance)
			 delete _pInstance;
	 }


 private:
	 Singleton2() { cout << "Singleton()" << endl; }
	 Singleton2() { cout << "~Singleton()" << endl; }
 private:
	 static Singleton2 *_pInstance;
	 static pthread_once_t _once;
 };
 Singleton2 *Singleton2::_pInstance = NULL;
 pthread_once_t Singleton2::_once = PTHREAD_ONCE_INIT;


查看评论

单例模式的三种常用的形式

自己做下笔记: //单例模式:他的应用场景—如果多个程序要操作一个对象中的数据,那么就要保证只有一个对象。 //饿汉式 publicclassSingle {     privatesta...
  • jiyidehao
  • jiyidehao
  • 2016-02-28 12:26:52
  • 589

Java单例模式的三种实现方式

1, singletonpublic class Singleton { private Singleton() { System.out.println("This is co...
  • gsw204
  • gsw204
  • 2016-09-06 19:37:28
  • 1209

Java设计的单例模式(三种写法)

最近在一些博客上面看到的单例模式,无一例外都是饿汉和懒汉,这两个确实是单例模式,但是各有自己的弊端 先上代码吧 //饿汉式 class ClassA{ private static final Cl...
  • Warton_
  • Warton_
  • 2017-03-10 21:29:58
  • 282

单例模式的三种写法

这里介绍三种单例模式写法。 第一种:饿汉模式 类加载时就初始化 public class SingleTonHungry { private static SingleTonHungry si...
  • Jun_P
  • Jun_P
  • 2015-11-05 12:47:54
  • 232

三种单例模式的创建方法

单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。一、懒汉式单例懒汉式单例在类被加载的时...
  • Love_JavaProgram
  • Love_JavaProgram
  • 2011-03-18 17:24:00
  • 1346

单例模式的写法(3种)

2015/9/61.单例模式让一个类所产生的对象只有唯一一个。其中三种方法中,第一种方法最有效率,第二种效率最差,第三种方法延迟加载,支持高。 /** * 单例模式 * @author a...
  • kang82651204
  • kang82651204
  • 2015-09-10 18:37:59
  • 398

Java单例模式的全面总结

  • 2010年12月15日 00:21
  • 78KB
  • 下载

博客专栏:二十三种设计模式之单例模式

我将自己学习单例模式的经历表达出来,作为自己学习的一次总结,也希望可以帮到大家。 我觉得这样子的一个学习过程比较合适,我会先将单例模式的五种形式给出来,然后再进行剖析。 学习的过程借鉴了以...
  • qq_30901199
  • qq_30901199
  • 2016-04-05 11:17:02
  • 257

Java单例模式常用的3种实现方式

单例模式是为了保证在运行环境中只有
  • u013530741
  • u013530741
  • 2014-10-19 11:03:09
  • 1365

单例模式的三种实现方法

在实际开发中,我们往往需要一个类只能被实例化一次,如果有多个对象的话,就会导致混乱情况发生。 优点 一、实例控制 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯...
  • ChenYang1998
  • ChenYang1998
  • 2017-11-18 13:40:36
  • 67
    个人资料
    等级:
    访问量: 0
    积分: 10
    排名: 251万+
    文章分类
    文章存档