赞
踩
你好,我是爱养猫的程序员雪球,今天与你分享设计模式之单例模式。
单例模式是指一个类只允许创建一个对象(或实例)的模式。它在很多应用场景中具有重要作用,例如处理资源访问冲突(如日志文件写入)和表示全局唯一类(如配置信息类、唯一递增 ID 号码生成器类等)。本文将介绍单例模式的实现形式、弊端以及可替代的解决方案。
单例模式的实现形式有以下四种:
1. 饿汉式:在类加载期间,就已经将 instance 静态实例初始化好了,所以 instance 实例的创建是线程安全的。但这种实现方式不支持延迟加载实例。
2. 懒汉式:只在调用 getInstance() 方法时才创建实例,支持延迟加载实例,但会导致频繁加锁、释放锁以及并发度低等问题。
3. 双重检测式:既支持延迟加载,又支持高并发度单例实现方式。只要 instance 被创建之后,再调用 getInstance() 函数都不会进入到加锁逻辑中。所以,这种方式解决了懒汉式并发度低的问题。
4. 静态内部类形式:利用 JAVA 的静态内部类来实现单例。这种实现方式,既支持延迟加载,也支持高并发,实现起来也比双重检测简单。
5. 枚举类形式:最简单的形式是基于枚举类型的单例实现。这种实现方式通过 JAVA 枚举类型本身的特性,保证了实例创建的线程安全性也实例的唯一性。
然而,单例模式存在一定的弊端:
1. 单例对 OOP 特性的支持不友好。
2. 单例会隐藏类之间的依赖关系。
3. 单例对代码的可扩展性不友好。
4. 单例对代码的可测试性不友好。
5. 单例不支持参数的构造函数。
为了解决这些问题,可以尝试以下替代方案:
1. 静态方法实现:确保全局唯一,但不解决上述问题。
2. 工厂模式:通过工厂类创建实例,支持参数化的构造函数,解决了单例模式的部分弊端。
3. Spring 的 IOC 容器:提供依赖注入,实现类的全局唯一性,同时支持参数化的构造函数,从根本上解决了单例模式的问题。
如果你有收获,欢迎评论,点赞,收藏加关注。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。