设计模式之单例模式
2023-12-23 20:28:37
单例模式
定义
Singleton Design Pattern
Singleton
类称为单例类,通过使用private
的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的(在Singleton
中自己使用new Singleton()
)。
- 全局唯一
- 处理资源访问冲突
单例模式通用类
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
// 防止产生多个对象
private Singleton() {
}
// 通过该方法生成实例对象
public static Singleton getInstance() {
return INSTANCE;
}
// 尽量是static
public static void doSomething() {
}
}
特点
- 减少内存开销,不用频繁地创建、销毁,而且创建或销毁时性能又无法优化;
- 只有一个实例对象,减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决;
- 可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作;
- 可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。
缺点
- 一般没有接口,扩展很困难
- 单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能使用mock的方式虚拟一个对象。
- 单例模式与单一职责原则有冲突。一个类应该只实现一个逻辑,而不关心它是否是单例的,是不是要单例取决于环境,单例模式把“要单例”和业务逻辑融合在一个类中。
几种单例代码
- 饿汉式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
private static Singleton getInstance() {
}
}
- 懒汉式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
private static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public synchronized static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
public class Singleton {
private volatile static Singleton instance;
private Singleton (){
}
public synchronized static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
文章来源:https://blog.csdn.net/youxiaxiaomage/article/details/135173281
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!