单例模式使用

张开发
2026/4/16 13:57:38 15 分钟阅读

分享文章

单例模式使用
一、单例模式到底是什么官方定义单例模式Singleton Pattern是一种创建型设计模式保证一个类永远只有一个实例提供一个全局访问点获取这个实例禁止外部手动创建新实例大白话整个程序运行期间不管你调用多少次永远只创建一个对象大家共用这一个。核心三要素私有构造函数不让别人new出来静态私有实例自己保存唯一的那个对象公开静态获取方法给外部拿对象的入口二、为什么要用单例必须记住的 4 个理由节约资源模型、数据库连接、摄像头、日志、配置文件 → 加载一次就够了。避免冲突多个对象写同一个文件/显存/设备会报错。全局状态统一配置改一次全程序生效。控制访问统一入口方便管理。三、单例模式的 2 种核心分类面试必考1. 饿汉式Eager Initialization类加载时就创建实例优点简单、线程安全缺点不用也占内存2. 懒汉式Lazy Initialization第一次用到时才创建优点节省资源缺点需要处理线程安全四、6 种经典实现方式从简单到高级我用Python C都写一遍你直接复制就能用。方式1最简单 Python 单例new方法最常用、最推荐。classSingleton:_instanceNone# 唯一实例def__new__(cls,*args,**kwargs):# 没有实例才创建ifcls._instanceisNone:cls._instancesuper().__new__(cls)returncls._instance# 测试aSingleton()bSingleton()print(aisb)# True → 同一个对象方式2线程安全懒汉式工业级多线程环境必须加锁importthreadingclassSingleton:_instanceNone_lockthreading.Lock()# 锁def__new__(cls):withcls._lock:# 加锁保证线程安全ifcls._instanceisNone:cls._instancesuper().__new__(cls)returncls._instance方式3装饰器单例最优雅defsingleton(cls):instances{}defget_instance(*args,**kwargs):ifclsnotininstances:instances[cls]cls(*args,**kwargs)returninstances[cls]returngetinstancesingletonclassModel:passm1Model()m2Model()print(m1ism2)# True方式4模块级单例Python 天然单例Python 的import 机制天生就是单例# singleton.pymodelYOLO(yolov8.pt)# main.pyfromsingletonimportmodel# 无论 import 多少次都是同一个对象这是 Python 最简单、最稳定的单例。方式5C 饿汉式classSingleton{private:staticSingleton*instance;Singleton(){}// 私有构造public:staticSingleton*getInstance(){returninstance;}};Singleton*Singleton::instancenewSingleton();方式6C 懒汉式双检锁classSingleton{private:staticSingleton*instance;staticmutex mtx;Singleton(){}public:staticSingleton*getInstance(){if(instancenullptr){lock_guardmutexlock(mtx);if(instancenullptr){instancenewSingleton();}}returninstance;}};五、单例模式的坑点90%的人踩过1. 多线程不安全懒汉式不加锁 → 会创建多个实例解决加锁 / 饿汉式 / 装饰器2. 序列化/反序列化破坏单例很少用但要知道。3. 反射破坏单例Java/C# 常见。4. 单元测试困难单例全局共享 → 测试互相干扰解决提供reset()方法。5. 内存泄漏C 中需要手动释放。六、图像 必用场景超级实用1. 深度学习模型加载最常用模型大、加载慢、占显存 →必须单例classModelSingleton:_instanceNone_modelNonedef__new__(cls):ifcls._instanceisNone:cls._instancesuper().__new__(cls)returncls._instancedefget_model(self):ifself._modelisNone:self._modelYOLO(yolov8.pt)returnself._model2. 摄像头/视频流管理classCameraSingleton:_capNonedefget_capture(self):ifself._capisNone:self._capcv2.VideoCapture(0)returnself._cap3. 算法配置管理classConfigSingleton:conf0.25iou0.45全程序共用一套参数。4. GPU 显存管理器classGPUManager:_instanceNonedefallocate(self,size):# 统一分配显存pass5. 日志系统classLoggerSingleton:deflog(self,msg):print(msg)七、单例模式总结一句话记住单例 一个类永远只有一个对象 全局访问 节约资源 避免冲突

更多文章