单例模式(singleton pattern)的几种实现

原创 2013年09月05日 17:49:08

     单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。本文展示c++语言中单例模式的几种实现方式及细节处理。

第一种:使用静态成员实例。

#include <iostream>
using namespace std;

class singleton
{
public:
	static singleton* GetInstance()
	{
		if ( m_instance == NULL ) 
		{
			cout<<"a new instance"<<endl;
			m_instance = new singleton();
		}
		return m_instance;
	}
	void release()
	{
		if(this->m_instance!=NULL)
		{
			delete this->m_instance;
			m_instance=NULL;//注意delete之后将指针设为null
			cout<<"free the instance"<<endl;
		}
	}

private:
    singleton(){}
    static singleton * m_instance;
};

singleton* singleton::m_instance = NULL;  

int main()	
{
	singleton* s=singleton::GetInstance();
	singleton* t=s->GetInstance();
	cout<<s<<endl<<t<<endl;
	t->release();
	return 0;
}


执行结果如下:

两个指针地址相同,说明是同一个指向singleton的指针。

为什么静态成员变量一定指针而不是singleton对象呢?因为直接返回对象是值传递,返回的是实例的副本。那为什么不返回一个引用呢?

#include <iostream>
using namespace std;

class singleton
{
public:
	static singleton& getOnlyInstance()
	{	  
	   return theOnlyInstance;
	}
private:
	singleton(){
	 cout<<"singleton build"<<endl;
	}
	 static singleton theOnlyInstance;
};

singleton singleton::theOnlyInstance=*(new singleton());

int main()
{   
	cout<<&singleton::getOnlyInstance()<<endl;
	cout<<&singleton::getOnlyInstance()<<endl;
	singleton s=singleton::getOnlyInstance();	
	singleton q=singleton::getOnlyInstance();
	cout<<&s<<endl<<&q<<endl;
	return 0;
}

运行结果如下:

可以看到,返回的确实是同一个实例了,同时却出现了另一个问题:这个唯一的实例可以通过赋值来创建副本,这就打破了单例模式的初衷。不过我们可以通过将拷贝构造函数和赋值运算符重载函数写为private来避免客户的复制操作。不过比起指针,这种方式用起来还是有些不方便。

#include <iostream>
using namespace std;

class singleton
{
public:
	static singleton& getOnlyInstance()
	{	  
	   return theOnlyInstance;
	}
private:
	singleton(singleton &){}
	singleton operator=(singleton&){};
	singleton(){
	 cout<<"singleton build"<<endl;
	}
	static singleton theOnlyInstance;
};

singleton singleton::theOnlyInstance=*(new singleton());

int main()
{   
	cout<<&singleton::getOnlyInstance()<<endl;
	cout<<&singleton::getOnlyInstance()<<endl;
	//singleton s=singleton::getOnlyInstance();	
	//singleton q=singleton::getOnlyInstance();
	//s=q;
	//cout<<&s<<endl<<&q<<endl;
	return 0;
}


第二种:使用静态局部实例。同样地需要避免赋值的发生。

#include <iostream>
using namespace std;

class singleton
{
public:
	static singleton& getOnlyInstance()
	{	  
	   static singleton theOnlyInstance;
	   return theOnlyInstance;	   
	}
private:
	singleton(singleton &){}
	singleton operator=(singleton&){};
	singleton(){
	 cout<<"singleton build"<<endl;
	}
};


int main()
{   
	cout<<&singleton::getOnlyInstance()<<endl;
	cout<<&singleton::getOnlyInstance()<<endl;
	//singleton s=singleton::getOnlyInstance();	
	//singleton q=singleton::getOnlyInstance();
	//s=q;
	cout<<&s<<endl<<&q<<endl;
	return 0;
}


或者使用返回指向局部实例的指针来实现:

#include <iostream>
using namespace std;

class singleton
{
public:
	static singleton* getOnlyInstance()
	{	  
	   static singleton theOnlyInstance;
	   return &theOnlyInstance;	   
	}
private:
	//singleton(singleton &){}
	//singleton operator=(singleton&){};
	singleton(){
	 cout<<"singleton build"<<endl;
	}
};


int main()
{   
	cout<<singleton::getOnlyInstance()<<endl;
	cout<<singleton::getOnlyInstance()<<endl;
	singleton* s=singleton::getOnlyInstance();	
	singleton* q=singleton::getOnlyInstance();
	//s=q;
	cout<<s<<endl<<q<<endl;
	return 0;
}


单例模式(Singleton)的6种实现

分享到... 复制网址邮件腾讯微博网易微博百度搜藏人人网开心网搜狐微博一键分享豆瓣新浪微博QQ空间微信易信QQ好友查看更多(122) 这是什么工具? ...
  • shenyue304
  • shenyue304
  • 2014年03月20日 11:34
  • 3194

设计模式(创建型)之单例模式(Singleton Pattern)

单例模式可能是23种设计模式中最简单的。应用也非常广泛,譬如Android中的数据库访问等操作都可以运用单例模式。核心概念: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称...
  • yanbober
  • yanbober
  • 2015年04月27日 16:50
  • 2565

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

单例模式大家并不陌生,分为懒汉式、饿汉式之类的。它们是有些细微的不同,下面就一点一点告诉你们这俩汉子有嘛不同   下面是一个简单的小实例: //简单懒汉式 public class Singleton...
  • knockheart
  • knockheart
  • 2013年06月19日 11:46
  • 2707

Singleton pattern单例模式应用

  • 2012年01月13日 15:47
  • 82KB
  • 下载

单例模式(Singleton pattern)的三种写法(含枚举实现方式)

最近项目组开始找人,试卷上豁然是个经典的问题(话说我毕业那会儿都已经是老题目,如今还在用)那就是, 哥们儿,写个单例模式吧! 恰巧今天早上看《effective java》看到单例模式的一种新写法。就...
  • u013439437
  • u013439437
  • 2014年03月06日 21:10
  • 691

单例模式(Singleton pattern)四种实现

单例实现1:经典单例模式(Classic singleton pattern) 实现延迟实例化(Lazy instantiaze);线程不安全(thread-unsafe)可用来学习单例模式...
  • lfb111lfb
  • lfb111lfb
  • 2013年06月06日 13:35
  • 597

Swift 实现单例模式Singleton pattern的三种方法

 From my short experience with Swift there are three approaches to implement the Singleton patt...
  • iToystar
  • iToystar
  • 2015年11月20日 10:07
  • 105

创建型模式之单例模式(Singleton Pattern)

  • 2011年07月06日 17:24
  • 6KB
  • 下载

Python实现设计模式--01.单例模式(Singleton Pattern)

1、基于模块引用(饱汉模式) 建立文件Emperor_Singleton.py,内容如下: # 皇帝类 class Emperor(object): def say(self): ...
  • boy_vansun
  • boy_vansun
  • 2017年07月19日 08:10
  • 103

【设计模式】设计模式C++编程实现之单例模式(Singleton Pattern)

有一些对象我们只需要一个,比如说线程池(threadpool)缓存(cache)、对话框、处理偏好设置和注册表的对象、日志对象,充当打印机、显卡等设备的驱动程序的对象。如果制造出多个实例,则会导致许多...
  • xiajun07061225
  • xiajun07061225
  • 2013年04月17日 14:57
  • 2934
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单例模式(singleton pattern)的几种实现
举报原因:
原因补充:

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