在编程的世界里,有一种设计模式叫做**单例模式**,它的核心思想是:**一个类只能有一个实例**。这让我想起了现实世界中的一个真理:**一个王国只能有一个国王**!今天,我们就用这个有趣的比喻来聊聊单例模式,顺便调侃一下代码中的“国王”们。
国王的诞生:构造函数私有化
在我们的代码中,`King`类的构造函数被声明为`private`,这意味着**国王的诞生是高度机密的**,普通人(外部代码:King wanger;)无法随意创建一个国王。想象一下,如果任何人都能随便宣布自己是国王,那这个王国岂不是乱套了?
class King {
private:
King() {
cout << "国王登基了!" << endl;
}
};
- 国王的诞生仪式是私密的,只有王室内部(类的成员函数)才能主持。
- 如果你在代码中写`King k;`,编译器会毫不留情地告诉你:“你以为你是谁?国王是你想当就能当的吗?”
王位的继承:静态成员函数
既然国王的诞生是私密的,那我们如何获取国王的实例呢?答案是:通过一个**静态成员函数**,比如`getInstance()`。这个函数就像是王位的继承仪式,只有通过它,你才能合法地获得国王的宝座。
static King* getInstance() {
if (instance == nullptr) {
instance = new King();
}
return instance;
}
- `getInstance()`就像是王位的继承仪式,只有通过它,你才能合法地成为国王。
- 如果国王还没有登基(`instance == nullptr`),那么这个函数会帮你完成登基仪式。
- 如果国王已经存在,它会直接告诉你:“别想了,王位已经有人了!”
王位的唯一性:静态成员变量
在单例模式中,我们用一个**静态成员变量**`instance`来保存国王的唯一实例。这个变量就像是王国的王座,永远只属于一个人。
static King* instance;
- 王座(`instance`)是唯一的,永远只能坐一个人。
- 如果有人想篡位(直接创建对象),编译器会立刻制止:“王座已经有人了,你别想了!”
国王的职责:成员函数
国王当然不能只是个摆设,他还要履行自己的职责。在我们的代码中,国王的职责是通过成员函数`doSomething()`来完成的。
void doSomething() {
cout << "国王正在处理政务!" << endl;
}
- 国王的职责是处理政务(`doSomething()`),而不是整天坐在王座上发呆。
- 如果你想让国王干活,就得通过合法的途径(`getInstance()`)找到他。
王国的日常
让我们来看看这个王国的日常运作:
int main() {
// King k; // 错误:你以为你是谁?国王是你想当就能当的吗?
// 通过继承仪式获取国王
King* king = King::getInstance();
King* king1 = King::getInstance();
// 输出国王的地址,验证是否是同一个人
cout << "国王1的地址:" << hex << king << endl;
cout << "国王2的地址:" << hex << king1 << endl;
// 国王处理政务
king->doSomething();
king1->doSomething();
return 0;
}
**输出**:
```
国王登基了!
国王1的地址:0x7ffee4a8b9a0
国王2的地址:0x7ffee4a8b9a0
国王正在处理政务!
国王正在处理政务!
```
- 国王1和国王2的地址是一样的,说明他们是同一个人。
- 如果有人试图通过`King k;`来篡位,编译器会立刻制止:“王座已经有人了,你别想了!”
-单例模式的世界里,国王只有一个,篡位者终将被编译器制裁!”