单例模式:顾名思义,即一个类,只有一个实例,并且这个类,自行负责实例化。很多时候在程序开发过程中,有一些类生成的实例作用完全一样,但是频繁的生成或销毁对象,加大了内存的开销。所以就可以使用单例模式,生成全局唯一对象,供全局使用。
-
单例模式包含以下两个步骤:
- 将构造函数设为私有(private),防止new出新对象;
- 创建一个静态方法(如getlnstance()方法),代替构造的作用。在此静态方法中,创建实例或获取已经生成的实例。
-
单例模式的使用场景:
- 全局仅一个需要一个实例。如日志输出,连接数据库;
- 想要更好的管理全局变量,如config类,过多的创建可能造成系统混乱;
- 想要减少内存压力,减少GC。
-
单例模式一般有两种方法实现:懒汉模式 和 饿汉模式
- 懒汉模式:类加载时不生产实例,当第一次调用时才生成实例
public class Log{ private static volatile Log log; //将构造方法设为privete,禁止new新对象 private Log(){} public static Log getlnstance(){ if(log == null){ synchronized(Log.class){ //双重检查 if(log == null){ log = new Log(); } } } return log; } }- 饿汉模式:类一但加载,就创建一个单例,当第一次调用获取实例的时候,实例已经存在
public class Log{ private static volatile Log log = new Log(); //将构造方法设为privete,禁止new新对象 private Log(){} //调用此方法时,Log的实例已经创建,可直接返回实例 public static Log getlnstance(){ return log; } }