单例模式(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 pattern单例模式应用

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

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

单例实现1:经典单例模式(Classic singleton pattern) 实现延迟实例化(Lazy instantiaze);线程不安全(thread-unsafe)可用来学习单例模式...

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

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

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

1、基于模块引用(饱汉模式) 建立文件Emperor_Singleton.py,内容如下: # 皇帝类 class Emperor(object): def say(self): ...

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

有一些对象我们只需要一个,比如说线程池(threadpool)缓存(cache)、对话框、处理偏好设置和注册表的对象、日志对象,充当打印机、显卡等设备的驱动程序的对象。如果制造出多个实例,则会导致许多...

单例模式singleton的几种实现方式

满足单例模式共两点:1一个类只能有一个唯一实例  2提供全局访问点 Implementation1public class Singleton{ private static Singleton...

Singleton Pattern单例模式

单例模式:确保一个类只有一个实例,并提供一个全局访问点。 类图 Singleton类,其构造方法(函数)是私有的,然后对外公开一个getInstance()方法来获取实例。 经典模式的Singleto...

Chromium源码浅析---单例模式(Singleton Pattern)在Chromium中的应用

单例模式是一种常见的软件设计模式,该模式设计的目的是只允许系统中出现一个该类的实例。在Chromium的多进程架构中,有且只有一个Browser进程,所有的Renderer进程都与Browser进程通...
  • yl02520
  • yl02520
  • 2013年12月07日 20:06
  • 1823

单例模式(Singleton Pattern)——独一无二的对象

前言 概述 定义 注意 类图 设计模式的实现 懒汉式线程不安全 懒汉式线程安全 饿汉式线程安全但是不是延迟加载 双检锁双重校验锁DCL即double-checked locking线程安全 登记式静态...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单例模式(singleton pattern)的几种实现
举报原因:
原因补充:

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