查看: 304|回复: 0

[C/C++] 【C++】浅谈C++中的单例模式

[复制链接]

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
7734
人气
176
分享
52

最佳新人活跃会员

发表于 2023-9-7 19:04:45 | 显示全部楼层 |阅读模式
【什么是单例模式(By文心一言)】

单例模式是一种常用的软件设计模式,它保证了一个类只有一个实例,并提供一个全局访问点。这种模式通常用于需要对资源或状态进行共享的情况,可以避免创建过多的对象,从而节省系统资源,提高性能。
单例模式的核心要点是确保一个类只有一个实例,并且该实例易于全局访问。为了实现单例模式,通常需要采取一些措施,包括:
  • 构造函数私有化:将构造函数私有化,防止从类外部创建实例。
  • 提供一个全局访问点:提供一个全局访问点,使得外部代码可以通过这个访问点获取单例实例。
  • 双重检查锁定:在多线程环境下,需要采取措施确保只有一个线程能够创建实例,这通常通过双重检查锁定来实现。
单例模式的应用场景包括:
  • 需要对资源或状态进行共享的情况:例如,如果有一个全局的配置对象,可以通过单例模式实现全局访问。
  • 需要控制实例创建的情况:例如,如果某个对象的创建成本很高,可以通过单例模式限制该对象的创建数量。
  • 需要确保对象唯一性的情况:例如,如果需要将某个对象作为消息代理传递给其他对象,可以通过单例模式确保该对象的唯一性。
需要注意的是,单例模式也有一些潜在的问题和陷阱。例如,单例对象在应用程序启动时就已经创建,如果这个对象没有正确的生命周期管理,可能会导致内存泄漏。此外,在多线程环境下,如果没有采取正确的线程同步措施,可能会导致并发问题。因此,在使用单例模式时需要注意这些问题,并采取相应的措施进行解决。
总结:单例模式只能创建一个实例(不管多少个对象都指向一个实例),不会造成空间上的浪费
【代码示例(自己写的嗷)】
[C++] 纯文本查看 复制代码
#include <iostream>

class Sample {
private:  
    static Sample *instance;
    Sample() {} // 私有构造函数,不能在外部创建对象
public:  
    static Sample* getInstance()
    {  
        if (instance == nullptr) {  
            instance = new Sample();  
        }  
        return instance;  
    }  
};  
  
Sample* Sample::instance = nullptr; // 静态成员变量初始化,如果内部初始化必须为const,显然不现实  
  
int main()
{  
    Sample* singleton1 = Sample::getInstance();
    Sample* singleton2 = Sample::getInstance();

    if (singleton1 == singleton2) {  
        std::cout << "同一个实例" << std::endl;
    } else {
        std::cout << "不同的实例" << std::endl;  
    }  
  
    return 0;  
}
由于没有重载==运算符,所以比较对象的方式是比较内存位置,而单例模式由于只有一个实例,所以指针指向同一个位置

小菜鸡一枚~
Gitee主页:https://gitee.com/juruoqwq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表