【C++设计模式】单例模式
单例模式:保证一个类仅有一个实例
定义一个单例类:
1.私有化构造函数,以防止外界创建单例对象
2.用类的私有静态指针变量指向类的唯一实例
3.使用公有的静态方法获取实例
C++11规定了local static在多线程条件下的初始化行为,要求编译器保证了内部静态变量的线程安全性。在C++11标准下,《Effective C++》提出了一种更优雅的单例模式实现,使用函数内的 local static 对象。这样,只有当第一次访问getInstance()
方法时才创建实例。这种方法也被称为Meyers' Singleton。
懒汉式
class Singleton { private: //构造函数私用化 Singleton() {}; ~Singleton() {}; Singleton(const Singleton&); Singleton& operator=(const Singleton&); public: //保证线程安全性 static Singleton& getInstance() { static Singleton instance; return instance; } };
饿汉式
class Singleton { private: static Singleton instance; private: //构造函数私用化 Singleton() ; ~Singleton(); Singleton(const Singleton&); Singleton& operator=(const Singleton&); public: static Singleton& getInstance() { return instance; } }; //初始化的地方 Singleton Singleton::instance;
总结:
饿汉式虽然是线程安全的,懒汉式通常需要加锁来保证线程安全,但局部静态变量版本在C++11后是线程安全的。
c#里面的延迟初始化:
Lazy<T> 对象初始化默认是线程安全的,在多线程环境下,第一个访问 Lazy<T> 对象的 Value 属性的线程将初始化 Lazy<T> 对象,以后访问的线程都将使用第一次初始化的数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)