一个王国只能有一个国王:单例模式

在编程的世界里,有一种设计模式叫做**单例模式**,它的核心思想是:**一个类只能有一个实例**。这让我想起了现实世界中的一个真理:**一个王国只能有一个国王**!今天,我们就用这个有趣的比喻来聊聊单例模式,顺便调侃一下代码中的“国王”们。


国王的诞生:构造函数私有化

在我们的代码中,`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;`来篡位,编译器会立刻制止:“王座已经有人了,你别想了!”

-单例模式的世界里,国王只有一个,篡位者终将被编译器制裁!”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值