设计模式——单例模式及简单实现

本文深入解析单例模式的意图和应用场景,通过具体实例说明如何保证一个类只有一个实例,并提供全局访问点。探讨了单例模式在班主任和文件处理等场景的应用,详细展示了C++实现的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式

1. 意图

  1. 保证一个类仅有一个实例
  2. 提供一个访问它的全局访问点

2. 适用场景

  • 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

3. 应用实例

  1. 一个班级只有一个班主任。
  2. 在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。

4. 类图

1.png

说明

定义一个Instance操作,允许客户访问它的唯一实例。在C++中,它是一个静态成员函数。同时,该操作可以负责创建它自己的唯一实例。

5. 优点

  • 对唯一实例的受控访问
  • 缩小命名空间
  • 允许对操作和表示的精华
  • 允许可变数目的实例
  • 比类操作更灵活

5. 实现

Singleton.h

#ifndef DEBUG_SINGLETON_H
#define DEBUG_SINGLETON_H

#include <iostream>

class Singleton {
public:
    static Singleton *Instance();  // 共有静态成员方法(全局访问点)
    void method();

protected:
    Singleton();  // 保证了不能通过构造函数来创建对象实例

private:
    static Singleton *_instance;  // 私有静态成员
};


#endif //DEBUG_SINGLETON_H

Singleton.cpp

#include "Singleton.h"

using std::cout;
using std::endl;

Singleton *Singleton::_instance = nullptr;

Singleton *Singleton::Instance() {
    if (_instance == nullptr) {
        cout << "初始化了单例!" << endl;
        _instance = new Singleton();
    }
    return _instance;
}

void Singleton::method() {
    std::cout << "调用了实例方法!" << std::endl;
}

Singleton::Singleton() = default;

main.cpp

#include "Singleton.h"

int main() {
    Singleton *uniqueInstance = Singleton::Instance();
    uniqueInstance->method();

    return 0;
}
执行结果
初始化了单例!
调用了实例方法!

Singleton类中的静态成员方法Instance()是对外暴露的全局访问点,外界想要访问这个类的实例时,只能通过这个方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值