单例模式:5种手写实现、优缺点、生产选型
博客导语
单例模式:全局仅有一个实例,重复实例化返回同一个对象。适用于日志工具、数据库连接池、全局配置类。整理面试全部5种手写方案,对比线程安全、实现难度。
一、模块导入单例(生产首选,最简单)
Python模块天然单例:模块只会导入一次,全局共享同一个对象,无需手写代码,线程绝对安全,企业90%场景使用。
二、__new__方法重写(入门常用)
class Singleton: __instance = None def __new__(cls, *args, **kwargs): if cls.__instance is None: cls.__instance = super().__new__(cls) return cls.__instance # 多次实例化地址完全一致缺陷:多线程高并发会出现重复实例,线程不安全
三、线程安全加锁版单例
通过threading锁解决并发冲突,适合多线程爬虫、接口服务
四、装饰器实现单例
通用装饰器,任意类快速转为单例,复用性最强
五、元类metaclass实现单例
底层最高级写法,控制类创建过程,难度最高,面试压轴考点
五类方案选型总结
生产业务:优先模块单例,零BUG、最简单
普通单例:__new__写法,单线程使用
多线程:加锁版单例
通用复用:装饰器单例
面试作答:元类单例
