C++模板实现单例模式
2017-04-06 21:54
211 查看
单例模式的代码重复率太高,所以我就用模板来实现,提高了代码复用率
单例模式的实现要点:
1. 构造函数私有
2. 暴露一个函数来获取实例
可以用模板实现保存和获取实例,子类只要继承模板类就可以了
这里有个问题就是子类的构造函数是private的那么父类也不能构造,所以还需要把父类声明为友元类,这里用了宏来实现
上面是把实例放在函数的静态局部变量了,这样是第一次调用GetInstance时初始化实例
另一种写法是把实例放在类的静态变量里,这样就和全局变量一样是在main函数之前初始化。因为要放到头文件里,所以要用Visual C++特有的关键字
使用方法:
单例模式的实现要点:
1. 构造函数私有
2. 暴露一个函数来获取实例
可以用模板实现保存和获取实例,子类只要继承模板类就可以了
这里有个问题就是子类的构造函数是private的那么父类也不能构造,所以还需要把父类声明为友元类,这里用了宏来实现
#pragma once template<class T> class Singleton { protected: Singleton() = default; virtual ~Singleton() = default; public: static T& GetInstance() { static T s_instance; return s_instance; } }; #define DECL_SINGLETON(T) friend class Singleton<T>
上面是把实例放在函数的静态局部变量了,这样是第一次调用GetInstance时初始化实例
另一种写法是把实例放在类的静态变量里,这样就和全局变量一样是在main函数之前初始化。因为要放到头文件里,所以要用Visual C++特有的关键字
__declspec(selectany)来避免重定义
#pragma once template<class T> class Singleton { protected: Singleton() = default; virtual ~Singleton() = default; private: static T s_instance; public: static T& GetInstance() { return s_instance; } }; template<class T> __declspec(selectany) T Singleton<T>::s_instance; #define DECL_SINGLETON(T) friend class Singleton<T>
使用方法:
class A final : public Singleton<A> { DECL_SINGLETON(A); private: A() = default; virtual ~A() = default; };
相关文章推荐
- C++设计模式:Singleton的模板实现之一
- C++模板实现的通用工厂方法模式
- [设计模式]_[中级]_[模板方法C++例子实现举例]
- 大话设计模式--模板方法模式 TemplateMethod -- C++ 实现
- 从零开始学C++之模板(四):用模板实现单例模式、模板方式实现动态创建对象
- 设计模式C++实现(5)——原型模式、模板方法模式
- 设计模式C++实现(5)——原型模式、模板方法模式
- [设计模式]_[中级]_[模板方法C++例子实现举例]
- C++高效实现模板方法模式
- (C++实现)——模板方法模式(Template Method Pattern)
- 设计模式C++实现(5)——原型模式、模板方法模式
- 行为模式之模板方法模式(Template Pattern)C++实现
- 模板方法模式c++实现
- 我所理解的设计模式(C++实现)——模板方法模式(Template Method Pattern)
- C++实现类似反射模式(模板)
- 设计模式C++实现(5)——原型模式、模板方法模式
- C++模板实现的通用工厂方法模式
- c++ 实现模板方法模式
- 设计模式C++实现(5)——原型模式、模板方法模式
- 设计模式C++实现(5)——原型模式、模板方法模式