创建型设计模式之单例模式

创建型设计模式之单例模式

单例模式的经典实现方式有--->饿汉式、懒汉式、双重检测、静态内部类、枚举

单例模式之饿汉式

线程安全

将唯一实例初始化在类加载之前(唯一实例设置为静态,在程序启动时就创建实例)

饿汉式的特点是在程序启动时就创建实例,而懒汉式则是第一次调用时才创建

代码示例:

 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 }

 

posted @ 2025-05-20 16:31  璀丶璨星灬空  阅读(3)  评论(0)    收藏  举报