C/C++学习——单例模式(懒汉模式与饿汉模式)

C/C++学习------单例模式

一、什么是单例模式?

单例模式 (Singleton Pattern)是一种创建型设计模式,用于确保在应用程序的生命周期内只存在一个特定类的唯一实例。这意味着无论何时请求该类的实例,都将返回同一个实例,而不会创建多个相同的对象。

二、单例模式应用

资源共享:当多个对象需要共享同一个资源,如数据库连接、文件系统、日志记录器等时,使用单例模式可以确保只有一个实例在管理这些资源,避免资源冲突和浪费。

全局控制:某些类负责管理全局的配置或状态信息。通过单例模式,可以确保在整个应用程序中只有一个配置管理器或状态管理器。

惰性初始化:某些对象的创建和初始化可能会很昂贵,只有在需要时才应该进行。单例模式允许延迟对象的创建,直到第一次请求它。

避免重复操作:有时需要确保只有一个对象负责某种操作,以避免重复执行。

三、单例模式的特点

私有的构造函数 :单例类的构造函数必须是私有的,以防止外部代码直接实例化对象。

静态成员变量 :通常单例类包含一个私有的静态成员变量,用于保存唯一实例的引用。

静态成员函数 :通常单例类包含一个静态成员函数,用于获取唯一实例。这个函数通常会在内部检查是否已经创建了实例,如果没有,则创建一个新的实例并返回。

**

注意:静态成员变量的使用

**(静态成员变量是类的一部分,并不是类的实例的一部分同时静态成员函数不需要使用类的实例来调用,可以直接通过类名来调用

示例代码:

cpp 复制代码
#include <iostream>
class Myclass
{
public:
	static void myPrint(); //静态成员函数声明
};
void Myclass::myPrint() //静态成员函数声明
{
	std::cout << "测试静态成员函数!\n" << std::endl;
}

void test_1()
{
	/*
	静态成员函数是类的一部分,但不是类的实例的一部分;
	静态成员函数不需要使用类的实例来调用,可以直接通过类名来调用
	*/
	Myclass::myPrint();
}

int main()
{
	test_1();
	return 0;
}

四、单例模式C++代码示例(饿汉模式)

结果:在没有使用该类的情况下也会实例化对象。

cpp 复制代码
#include <iostream>

//单例模式实现 示例
class Singleton
{
    private:
        static Singleton _eton; //静态成员变量_eton的声明,这里并没有定义
        //构造函数
        Singleton():_data(99) 
        {
            std::cout << "单例模式构造!\n";
        }
        //删除拷贝构造,C++11特性
        Singleton(const Singleton&) =delete; 
        //析构函数
        ~Singleton(){}
    
    private:
        int _data;

    //对外提供的接口
    public:
        static Singleton &getInstance()
        {
            return _eton;
        }
        int getData()
        {
            return _data;
        }
};

Singleton Singleton::_eton; //静态成员函数的定义

int main()
{
    std::cout << Singleton::getInstance().getData() <<std::endl;
    return 0;
}

五、单例模式C++示例代码(懒汉模式)

懒汉模式 :第一次使用要使用单例对象的时候创建实例对象。如果单例对象构造特别耗时或者耗费资源(加载插件、加载网络资源等),可以选择懒汉模式,在第一次使用的时候才创建对象

cpp 复制代码
#include <iostream>

class Singleton
{
    private:
        Singleton():_data(90)
        {
            std::cout << "单例对象构造!\n" << std::endl;
        }
        Singleton(const Singleton&) = delete;
        ~Singleton(){}

    private:
        int _data;

    public:
        static Singleton &getInstance()
            {
                static Singleton _eton;
                return _eton;
            }
        int getData()
        {
            return _data;
        }
};


int main()
{
    std::cout << Singleton::getInstance().getData() << std::endl; //只有在实例化对象的时候才可以调用
    return 0;
}
相关推荐
t***5444 小时前
Clang 编译器在 Orwell Dev-C++ 中的局限性
开发语言·c++
yolo_guo6 小时前
redis++使用: hmset 与 hmget
c++·redis
handler016 小时前
拒绝权限报错!三分钟掌握 Linux 权限管理
linux·c语言·c++·笔记·学习
t***5447 小时前
如何在Dev-C++中选择Clang编译器
开发语言·c++
汉克老师8 小时前
GESP2023年9月认证C++三级( 第一部分选择题(9-15))
c++·gesp三级·gesp3级
Wave84511 小时前
C++继承详解
开发语言·c++·算法
Tairitsu_H11 小时前
C++类基础概念:定义、实例化和this指针
开发语言·c++
不想写代码的星星11 小时前
C++17 string_view 观察报告:好用,但有点费命
c++
努力努力再努力wz11 小时前
【Linux网络系列】深入理解 I/O 多路复用:从 select 痛点到 poll 高并发服务器落地,基于 Poll、智能指针与非阻塞 I/O与线程池手写一个高性能 HTTP 服务器!(附源码)
java·linux·运维·服务器·c语言·c++·python
努力努力再努力wz11 小时前
【Linux网络系列】万字硬核解析网络层核心:IP协议到IP 分片重组、NAT技术及 RIP/OSPF 动态路由全景
java·linux·运维·服务器·数据结构·c++·python