设计模式 -- 单例模式

发布于:2025-02-11 ⋅ 阅读:(32) ⋅ 点赞:(0)

单例模式

  • 单例模式:确保在整个程序运行期间只有一个类的实例存在,并提供全局访问点。常用于只需要创建一次的对象(如:数据库连接、日志记录器或配置管理器)
    优点:全局唯一实例入口,简化其他模块获取该服务的复杂度;只有一个实例,整个应用程序生命周期中实例始终可用,减少重复创建对象,避免资源浪费等
    缺点:全局可见,增加了系统的耦合性;全局唯一,单元测试会变得困难,尤其是当涉及到复杂的业务逻辑时;添加新功能时,需要修改现有代码的单例实现,不符合开闭原则等
  • 单例模式实现由两种方式:饿汉式单例模式和懒汉式单例模式
  • 两种方式的实例化时机不同,饿汉式单例在程序启动时(或在任何静态初始化发生时)就创建了实例,而懒汉式单例则延迟到实际需要时才创建实例
    在这里插入图片描述

C++ 实现

饿汉式单例模式

  • 在main函数之前或动态库加载之前就完成了单例的创建,使用时不需要再创建对象,因此是线程安全的
  • 缺点:在程序启动时就已经存在,因此它可能在某些情况下导致不必要的资源使用,特别是创建成本较高且程序在大部分运行时间内都不需要它时。在这些情况下,懒汉式单例模式可能是一个更好的选择
  • 注:全局变量的初始化直接放在头文件中通常是不安全的,因为会导致在每个包含该头文件的编译单元中都有这些变量的实例,从而引发重复定义链接错误。通常,建议这些全局变量放在源文件中(.cpp)
#include <iostream>
class Singleton
{
   
public:
	static Singleton& getInstance() {
    return instance; }
	void PrintLog() {
    std::cout << "CHungryMode " << std::endl; };
public:
	// 禁止拷贝、移动和赋值
	Singleton(const  Singleton& mode) = delete;
	Singleton(Singleton&& mode) = delete;
	Singleton& operator=(const  Singleton& mode) = delete;
private:
	Singleton() {
   };
	~Singleton() {
   };
private:
	static  Singleton instance;          //静态成员变量
};
Singleton  Singleton::instance;  // 定义静态成员变量(通常放在源文件中,而不是头文件中)

int main()
{
   
	Singleton::getInstance().PrintLog();
    system("pause");
}
  • Singleton 也可以在cpp文件直接定义为全局变量
#include "Singleton.h"
static Singleton instance; 
Singleton& Singleton::getInstance(){
   
	return instance; 
}

void Singleton::PrintLog(){
   
	std::cout << "CHungryMode" << std::endl; 
}

</


网站公告

今日签到

点亮在社区的每一天
去签到