最常用的设计模式-单例

哎,单例模式啊,这东西啊,我第一次接触到它的时候,我还挺懵的。
它呢,就是一种设计模式,主要就是用来保证一个类只有一个实例,然后还能提供这个实例的全局访问点。
说起来,我最早接触到单例模式是在2 02 2 年,那时候在一个城市的一个项目中,我们用到了单例模式来管理数据库连接池,当时为了提高性能和避免连接泄漏,我们用单例模式来管理这些连接。

喏,单例模式有几个核心特点,第一个就是唯一实例,这个通过私有化构造函数和静态成员变量来控制,确保全局唯一性。
第二个是延迟初始化,实例在首次调用时创建,避免资源浪费。
第三个是线程安全,这个嘛,得用volatile和synchronized关键字来解决多线程环境下的同步问题。

典型应用场景嘛,比如配置管理,日志记录,数据库连接池,还有缓存系统,这些都是单例模式常见的应用场景。
但是,单例模式也有潜在的问题,比如全局状态风险,耦合度高,多线程挑战,还有扩展性限制。
解决这些问题,我们可以设计无状态单例,或者通过不可变对象来规避全局状态风险,通过依赖注入来降低耦合度,使用双重检查锁定或者静态内部类来解决多线程挑战,结合工厂模式来提高扩展性。

代码实现上,Java中常用的有双重检查锁定,静态内部类,还有枚举实现。
双重检查锁定嘛,得注意volatile防止指令重排序,双重检查减少同步开销。
静态内部类呢,线程安全且懒加载,利用类加载机制保证唯一性。
枚举实现的话,天然线程安全,防止反射和序列化破坏单例。

权衡与替代方案嘛,单例模式有优点也有缺点,优点是资源节约、全局控制、简化访问,缺点是全局状态、测试困难、扩展受限。
替代方案有依赖注入和服务定位器,这些都可以平衡灵活性与控制。

总的来说,单例模式适用于需要严格控制实例数量的场景,但得谨慎处理线程安全、耦合度和可测试性。
在实际开发中,我一般优先选择静态内部类或枚举实现,并结合依赖注入等手段降低副作用。
对于复杂系统,我们可能需要评估是否需要更灵活的设计模式来替代单例。
嗯,就这样吧。

C++线程安全的单例模式

上周看代码的时候。
饿汉式确实简单。
就是启动就创建。

饱汉式用双重检查锁定。
第一次访问才创建。
需要加个锁。
避免多个线程同时创建。

然后局部静态变量。
C++1 1 开始就有。
编译器保证线程安全。
不需要自己加锁。
代码最干净。

2 02 3 年。
我那个朋友用C++1 1 的版本。
他说性能最好。
也不容易出错。

这部分我不确定。
但局部静态变量确实是最推荐的。
除非老项目没升级。