singleton.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /* Singleton 是单例类的模板。
  2. * https://www.cnblogs.com/sunchaothu/p/10389842.html
  3. * 单例 Singleton 是设计模式的一种,其特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例;
  4. * 全局只有一个实例:static 特性,同时禁止用户自己声明并定义实例(把构造函数设为 private 或者 protected)
  5. * Singleton 模板类对这种方法进行了一层封装。
  6. * 单例类需要从Singleton继承。
  7. * 子类需要将自己作为模板参数T 传递给 Singleton<T> 模板;
  8. * 同时需要将基类声明为友元,这样Singleton才能调用子类的私有构造函数。
  9. // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。
  10. // 父类的构造函数必须保护,子类的构造函数必须私有。
  11. // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来操作 唯一的实例。
  12. * */
  13. #ifndef __SINGLIETON_H
  14. #define __SINGLIETON_H
  15. //#include <iostream>
  16. template<typename T>
  17. class Singleton
  18. {
  19. public:
  20. //获取单例的引用
  21. static T& get_instance_references()
  22. {
  23. static T instance;
  24. return instance;
  25. }
  26. //获取单例的指针
  27. static T* get_instance_pointer()
  28. {
  29. return &(get_instance_references());
  30. }
  31. virtual ~Singleton()
  32. {
  33. // std::cout<<"destructor called!"<<std::endl;
  34. }
  35. Singleton(const Singleton&)=delete; //关闭拷贝构造函数
  36. Singleton& operator =(const Singleton&)=delete; //关闭赋值函数
  37. protected:
  38. //构造函数需要是 protected,这样子类才能继承;
  39. Singleton()
  40. {
  41. // std::cout<<"constructor called!"<<std::endl;
  42. }
  43. };
  44. /*
  45. // 如下是 使用样例:
  46. // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。
  47. // 父类的构造函数必须保护,子类的构造函数必须私有。
  48. // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。
  49. class DerivedSingle:public Singleton<DerivedSingle>
  50. {
  51. // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。
  52. friend class Singleton<DerivedSingle>;
  53. public:
  54. // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。
  55. DerivedSingle(const DerivedSingle&)=delete;
  56. DerivedSingle& operator =(const DerivedSingle&)= delete;
  57. ~DerivedSingle()=default;
  58. private:
  59. // 父类的构造函数必须保护,子类的构造函数必须私有。
  60. DerivedSingle()=default;
  61. };
  62. int main(int argc, char* argv[]){
  63. DerivedSingle& instance1 = DerivedSingle::get_instance_references();
  64. DerivedSingle* p_instance2 = DerivedSingle::get_instance_pointer();
  65. return 0;
  66. }
  67. */
  68. #endif