单例模式应该算是最简单的一种设计模式了,只需要提供一个static的getInstance方法,然后将构造函数以及赋值运算符全给删除,即可保证每次通过getInstance获取的是同一个对象。

但实际上,它只是把全局变量包装了一层,就像在花裤衩外套了一层西装,看起来好看点而已。忠告就是不要滥用单例模式,只有确实整个生命周期内只需要一个(例如日志模块)的场景才建议使用,否则单例对象会一直贮存在内存中,即使你已经不需要它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <utility>

class Singleton {
public:
static Singleton* getInstance() {
static Singleton instance;
return &instance;
}

Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(Singleton&&) = delete;
private:
Singleton() {
std::cout << "Singleton instance created." << std::endl;
}
~Singleton() {
std::cout << "Singleton instance destroyed." << std::endl;
}
};

int main() {
Singleton* singleton1 = Singleton::getInstance();
Singleton* singleton2 = Singleton::getInstance();

// Singleton sa = *singleton1;
// Singleton sb(*singleton1);
// Singleton sc = std::move(*singleton1);
// Singleton sd(std::move(*singleton1));
if (singleton1 == singleton2) {
std::cout << "Both instances are the same." << std::endl;
} else {
std::cout << "Instances are different." << std::endl;
}

return 0;
}