创建型设计模式之单例模式
创建型设计模式之单例模式
单例模式的经典实现方式有--->饿汉式、懒汉式、双重检测、静态内部类、枚举
单例模式之饿汉式
线程安全
将唯一实例初始化在类加载之前(唯一实例设置为静态,在程序启动时就创建实例)
饿汉式的特点是在程序启动时就创建实例,而懒汉式则是第一次调用时才创建
代码示例:
1 #include <iostream> 2 3 using namespace std; 4 5 class SingleHungryManMode 6 { 7 public: 8 static SingleHungryManMode *pins(); 9 ~SingleHungryManMode() = default; 10 11 private: 12 static SingleHungryManMode *myins; 13 SingleHungryManMode() = default; // 私有构造函数,防止外部通过new创建实例 14 SingleHungryManMode(const SingleHungryManMode &origin) = delete; // 禁止拷贝构造函数,防止通过拷贝生成新的实例 15 SingleHungryManMode &operator=(const SingleHungryManMode &origin) = delete; // 禁止赋值,防止通过赋值生成新的实例 16 17 SingleHungryManMode(const SingleHungryManMode &&origin) = delete; // 禁用移动构造函数,防止通过移动构造创建新的实例 18 SingleHungryManMode &operator=(SingleHungryManMode &&origni) = delete; // 禁用移动赋值函数,防止移动赋值转移实例状态 19 }; 20 21 SingleHungryManMode *SingleHungryManMode::myins = new SingleHungryManMode; // 提前初始化 22 23 SingleHungryManMode *SingleHungryManMode::pins() 24 { 25 return myins; 26 }
单例模式之饱汉式
线程不安全(可以为myins加锁,保证线程安全)
延迟初始化,只有在被访问的时候,才初始化实例(节省资源)
代码示例:(不安全版)
1 class SingleFullManMode 2 { 3 private: 4 static SingleFullManMode *myins; 5 6 SingleFullManMode() = default; 7 ~SingleFullManMode() = default; 8 9 SingleFullManMode(const SingleFullManMode &origin) = delete; 10 SingleFullManMode &operator=(const SingleFullManMode &origin) = delete; 11 12 SingleFullManMode &operator=(const SingleFullManMode &&origin) = delete; 13 SingleFullManMode(const SingleFullManMode &&origin) = delete; 14 15 public: 16 static SingleFullManMode *pins(); 17 }; 18 19 SingleFullManMode *SingleFullManMode::myins = nullptr; 20 21 SingleFullManMode *SingleFullManMode::pins() 22 { 23 if(myins == nullptr) 24 { 25 myins = new SingleFullManMode; 26 } 27 return myins; 28 }
代码示例:(安全版)
1 class SingleFullManMode 2 { 3 private: 4 static std::mutex mutex; 5 static SingleFullManMode *myins; 6 7 SingleFullManMode() = default; 8 ~SingleFullManMode() = default; 9 10 SingleFullManMode(const SingleFullManMode &origin) = delete; 11 SingleFullManMode &operator=(const SingleFullManMode &origin) = delete; 12 13 SingleFullManMode &operator=(const SingleFullManMode &&origin) = delete; 14 SingleFullManMode(const SingleFullManMode &&origin) = delete; 15 16 public: 17 static SingleFullManMode *pins(); 18 }; 19 20 SingleFullManMode *SingleFullManMode::myins = nullptr; 21 22 SingleFullManMode *SingleFullManMode::pins() 23 { 24 // lock_guard<std::mutex> lock(mutex);锁加在这里也行,但是pins()每次进来加锁影响效率 25 if (myins == nullptr) 26 { 27 lock_guard<std::mutex> lock(mutex); 28 if (myins == nullptr) 29 { 30 myins = new SingleFullManMode; 31 } 32 } 33 return myins; 34 }