设计模式-单例模式

参考:https://baijiahao.baidu.com/s?id=1762115701700295752&wfr=spider&for=pc
https://www.jb51.net/article/120969.htm
https://blog.csdn.net/weixin_44471490/article/details/108929289

使用场景

  1. 数据库连接池:单例模式可以确保在某个时刻只有一个数据库连接池实例存在,避免出现重复连接的问题。

  2. 日志处理器:在大多数情况下,我们创建一个日志处理器实例就足够了,使其成为单例可以减少内存和资源的浪费。

  3. 性能管理器:单例模式可以确保性能管理器在应用程序的整个生命周期中只有一个实例运行。

  4. 系统配置器:在应用程序中,我们通常使用系统配置器来处理环境变量、应用程序设置等,所以将其设为单例模式可以保证系统中仅有一个实例。

  5. 线程池:Java 线程池是一个非常重要的 API,创建多个线程池实例可能导致内存使用过高,以将其设置为单例模式更加合适。

需要注意的是,过度使用单例模式会导致代码复杂性的增加,因此单例模式应该在确保只有一个实例有益且必要的情况下才应该使用。

饿汉式

  • 顾名思义,饿汉模式就是加载类的时候直接new一个对象,后面直接用即可。
  • 饿汉模式指在类中直接定义全局的静态对象的实例并初始化,然后提供一个方法获取该实例对象。
public class Singleton {
    // 使用static修饰,类加载的时候new一个对象
  	private static Singleton INSTANCE = new Singleton();
  
  	// 构造器私有化
  	private Singleton() {}
  	
  	public static Singleton getInstance() {
      	return INSTANCE;
    }
}

懒汉式

  • 顾名思义,懒汉模式就是加载类的时候只声明变量,不new对象,后面用到的时候再new对象,然后把对象赋给该变量。
  • 定义一个私有的静态对象INSTANCE,之所以定义INSTANCE为静态,是因为静态属性或方法是属于类的,能够很好地保障单例对象的唯一性;
  • 然后定义一个静态方法获取该对象,如果对象为null,则 new 一个对象并将其赋值给INSTANCE。
public class Singleton {
    
  	private static Singleton INSTANCE;
  
  	// 构造器私有化
  	private Singleton() {}
  	
  	public static Singleton getInstance() {
      	if (INSTANCE == null) {
          	INSTANCE = new Singleton();
        }
      	return INSTANCE;
    }
}

区别

  • 饿汉模式是在类加载时将其实例化的,在饿汉模式下,在Class Loader完成后该类的实例便已经存在于JVM中了,即,在getInstance方法第一次被调用前该实例已经存在了,new对象的操作不在getInstance方法内。
  • 而懒汉模式在类中只是定义了变量但是并未实例化,实例化的过程是在获取单例对象的方法中实现的,即,在getInstance方法第一次被调用后该实例才会被创建,new对象的操作在getInstance方法内。
  • 此外注意:饿汉模式的实例在类加载的时候已经存在于JVM中了,因此是线程安全的;懒汉模式通过第一次调用getInstance才实例化,该方法不是线程安全的

静态内部类

  • 静态内部类通过在类中定义一个静态内部类,将对象实例的定义和初始化放在内部类中完成,我们在获取对象时要通过静态内部类调用其单例对象。

  • 之所以这样设计,是因为类的静态内部类在JVM中是唯一的,这很好地保障了单例对象的唯一性。静态内部类的单例实现方式同样是线程安全的。

public class Singleton {
  
  	private static class SingletonHolder {
      	private static final Singleton INSTANCE = new Singleton();
    }
  
  	private Singleton(){}
  
  	public static final Singleton getInstance(){
      	return SingletonHolder.INSTANCE;
    }
}
posted @ 2023-10-24 11:27  hasome  阅读(3)  评论(0编辑  收藏  举报