一:单例模式#
定义:一个类在全局只有一个实例对象,这个类自行实例化后向整个系统提供这个实例
实现:禁止拷贝与赋值,防止破坏实例的唯一性
缺点:全局状态强,调试困难
- 懒汉式单例模式:
1class Singleton
2{
3public:
4 // 在第一次调用 getSingleton() 才初始化
5 static Singleton* getSingleton()
6 {
7 // 局部静态变量
8 // 在程序结束后自动释放内存
9 // 防止内存泄漏
10 // 同时也确保了线程安全
11 static Singleton instance;
12 return &instance;
13 }
14
15private:
16 Singleton() {}
17 ~Singleton() {}
18 Singleton(const Singleton&);
19 Singleton& operator=(const Singleton&);
20};
- 饿汉式单例模式:
1class Singleton
2{
3public:
4 static Singleton* getSingleton()
5 {
6 return &instance;
7 }
8
9private:
10 Singleton() {}
11 ~Singleton() {}
12 Singleton(const Singleton&);
13 Singleton& operator=(const Singleton&);
14
15 // 饿汉式的实例是定义在类外的
16 // 在 main() 之前进行初始化
17 static Singleton instance;
18};
常见问题:
为什么不直接使用全局变量?
因为使用单例可以控制初始化时机(static 变量在第一次调用时才被初始化),并且单例可以对接口进行封装
二:工厂模式#
定义: