c++11 改进设计模式 Singleton模式

关于学习 《深入应用c++11》的代码笔记:

c++11之前是这么实现的

template<typename T>
class Singleton{
public:
	static T* Instance(){
		if (m_pInstance == nullptr)
			m_pInstance = new T();
		return m_pInstance;
	}

	template<typename T0>
	static T* Instance(T0 arg0){
		if (m_pInstance == nullptr)
			m_pInstance = new T(arg0);
		return m_pInstance;
	}

	template<typename T0,typename T1>
	static T* Instance(T0 arg0, T1 arg1){
		if (m_pInstance == nullptr)
			m_pInstance = new T(arg0, arg1);
		return m_pInstance;
	}

	template<typename T0, typename T1,typename T2>
	static T* Instance(T0 arg0, T1 arg1,T2 arg2){
		if (m_pInstance == nullptr)
			m_pInstance = new T(arg0, arg1,arg2);
		return m_pInstance;
	}

	template<typename T0, typename T1, typename T2,typename T3>
	static T* Instance(T0 arg0, T1 arg1, T2 arg2,T3 arg3){
		if (m_pInstance == nullptr)
			m_pInstance = new T(arg0, arg1, arg2,arg3);
		return m_pInstance;
	}

	template<typename T0, typename T1, typename T2, typename T3,typename T4>
	static T* Instance(T0 arg0, T1 arg1, T2 arg2, T3 arg3,T4 arg4){
		if (m_pInstance == nullptr)
			m_pInstance = new T(arg0, arg1, arg2, arg3,arg4);
		return m_pInstance;
	}

	template<typename T0, typename T1, typename T2, typename T3, typename T4,typename T5>
	static T* Instance(T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4,T5 arg5){
		if (m_pInstance == nullptr)
			m_pInstance = new T(arg0, arg1, arg2, arg3, arg4,arg5);
		return m_pInstance;
	}

	static T* GetInstance()
	{
		if (m_pInstance == nullptr)
			throw std::logic_error("the instance is not init,please init the instance first");

		return m_pInstance;
	}

	static void DestroyInstance(){
		delete m_pInstance;
		m_pInstance = nullptr;
	}

private:
	Singleton(void);
	virtual ~Singleton(void);
	Singleton(const Singleton&);
	Singleton& operator = (const Singleton);

	static T* m_pInstance;
};

template<class T> T* Singleton<T>::m_pInstance = nullptr;

//============================================
struct A{
	A(){}
};

struct B{
	B(int x){}
};

struct C{
	C(int x, double y){}
};

int _tmain(int argc, _TCHAR* argv[])
{
	Singleton<A>::Instance();
	Singleton<A>::Instance();
	Singleton<B>::Instance(1);
	Singleton<C>::Instance(1,3.14);

	Singleton<A>::DestroyInstance();
	Singleton<B>::DestroyInstance();
	Singleton<C>::DestroyInstance();

	return 0;
}

  c++11之后可以简略一点,使用了可变模板参数

template<typename T>
class Singleton{
public:
	template <typename... Args>
	static T* Instance(Args&&... args){
		if (m_pInstance == nullptr)
			m_pInstance = new T(std::forward<Args>(args)...);
		return m_pInstance;
	}

	static T* GetInstance(){
		if (m_pInstance == nullptr)
			throw std::logic_error("the instance is not init,please initialize the instance first");
		return m_pInstance;
	}

	static void DestroyInstance()
	{
		delete m_pInstance;
		m_pInstance = nullptr;
	}

private:
	Singleton(void);
	virtual ~Singleton(void);
	Singleton(const Singleton&);
	Singleton& operator=(const Singleton&);
private:
	static T* m_pInstance;
};

template<class T>T* Singleton<T>::m_pInstance = nullptr;

#include <iostream>
#include <string>

using namespace std;

struct A{
	A(const string&){ cout << "lvalue" << endl; }
	A(string&&x){ cout << "rvalue" << endl; }
};

struct B{
	B(const string&){ cout << "lvalue" << endl; }
	B(string&& x){ cout << "rvalue" << endl; }
};

struct C{
	C(int x, double y){}
	void Fun(){ cout << "Test" << endl; }
}; 

int _tmain(int argc, _TCHAR* argv[])
{
	string str = "bb";
	Singleton<A>::Instance(str);
	Singleton<B>::Instance(std::move(str));
	Singleton<C>::Instance(1,3.14);
	Singleton<C>::GetInstance()->Fun();

	Singleton<A>::DestroyInstance();
	Singleton<B>::DestroyInstance();
	Singleton<C>::DestroyInstance();

	return 0;
}

  

时间: 2024-11-11 11:06:58

c++11 改进设计模式 Singleton模式的相关文章

设计模式--singleton模式

使用单件模式的意图是保证一个类只有一个实例,并提供一个访问它的全局访问点. 将单件定义为全局或静态对象,然后依赖于自动的初始化,并不能完全实现上述意图.虽然可以提供全局访问点,但这是不够的.原因如下: 1)我们不能保证静态对象只有一个实例会被声明. 2)我们可能没有足够信息在静态初始化时实例化每个单件,单件可能需要在程序运行中稍后被计算出来的值. 3)c++没有定义转换单元上全局对象的构造器的调用顺序.这意味着单件之间不存在依赖关系:如果有,那么错误将是不可避免的. 4)使用全局或静态对象的实现

GOF设计模式——Singleton模式

一.什么是Singleton模式? Singleton模式就是平常所说的单例模式,简单来说就只有一个实例.在使用java.lang.String的时候,将不同的字符串赋给String引用,其实就是创建了一个String对象实例,当有1000个不同的字符串创建的时候,就会出现1000个实例.有时候,我们只想在程序里面创建一个实例,譬如Hibernate的SessionFactory,那么我们可以使用Singleton模式来设计某一个类从始至终,程序调用的都是属于同一个实例. 二.Singleton

设计模式(五)Singleton模式

Singleton模式就是确保只生成一个实例的模式.这里有两个意思,即想确保任何情况下都绝对只有一个实例和想在程序上表现出"只存在一个实例". 下面通过一个实例来说明这种设计模式. 1 package BigJunOba.bjtu.Singleton; 2 3 public class Singleton { 4 5 private static Singleton singleton = new Singleton(); 6 7 private Singleton() { 8 Sys

设计模式 - 单件模式(singleton pattern) 详解

单件模式(singleton pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28595349 单件模式(singleton pattern) : 确保一个类只有一个实例, 并提供一个全局访问点. 单价模式包括3个部分: 私有构造器, 静态变量, 静态方法. 具体方法: 1. 标准的单例模式: /** * @time 2014.6.5 */ package singleton; /** * @author

跟刺猬哥一起学习设计模式【Singleton模式】

设计模式的分类 从目的来看: 创建型模式:负责对象创建 结构性模式:处理类与对象间的组合 行为型模式:类与对象交互中的职责分配 从范围来看: 类模式处理类与子类的静态关系 对象模式处理对象间的动态关系 动机 在软件系统中,经常有这样的一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性以及良好的效率. 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例呢?其实这应该是类设计者的责任,而不是使用者的责任. 意图 保证一个类仅有一个实例,并提供一个该实例的全局访问点. 

Java开发中的23种设计模式详解之三:11种行为型模式

本章是关于设计模式的最后一讲,会讲到第三种设计模式--行为型模式,共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式.这段时间一直在写关于设计模式的东西,终于写到一半了,写博文是个很费时间的东西,因为我得为读者负责,不论是图还是代码还是表述,都希望能尽量写清楚,以便读者理解,我想不论是我还是读者,都希望看到高质量的博文出来,从我本人出发,我会一直坚持下去,不断更新,源源动力来自于读者朋友们的不断支持,我会尽自己

设计模式:Registry of Singleton模式

原文地址:http://leihuang.org/2014/12/05/registry-of-singleton/ Creational 模式 物件的产生需要消耗系统资源,所以如何有效率的产生.管理 与操作物件,一直都是值得讨论的课题, Creational 模式即与物件的建立相关,在这个分类下的模式给出了一些指导原则及设计的方向.下面列举到的全属于Creational 模式 Simple Factory 模式 Abstract Factory 模式 Builder 模式 Factory Me

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

singleton(单例)模式被熟知的原因是因为它限制了类的实例化次数只能一次,单例模式,在该实例不存在的勤快下,可以通过一个方法创建一个类来实现创建类的新实例:如果实例已经存在,则会简单返回该对象的引用.单例模式不同于静态类(或对象),因为我们可以推迟它们的初始化,这通常是因为它需要一些信息,而这些信息在初始化期间可能无法获取,对于没有察觉到之前的引用代码,它们不会提供方便检索方法,这是因为它既不是对象,也不是由一个single返回的类,而是一个结构,在js中,singleton充当共享资源命

设计模式组合模式(Composite)精华

23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助如何创建一个系统独立.这是一个这些对象和陈述的组合. 创建使用继承类的类架构更改实例.的对象类型模型的建立也将委托实例化一个对象. 创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此.创建型模式在什么被创建.谁创建它,它是怎样被创建的,以及何时创建这些方