单例模式
定义:
单例模式确保一个类只有一个实例,并提供一个全局访问点。包括两点:
1. 避免其他类再自行产生实例,要想取得单例实例,通过单例类是唯一途径。
2. 单例也提供对这个实例的全局访问点:当需要实例时,向类查询,它会返回单个实例。
基本规则:
1. 私有的构造方法,不允许使用者直接new对象,只能自己去构造。
2. 公有的静态实例化方法,如getInstance()。
场景:
单例模式常用来管理共享的资源,如数据库连接或连接池。
优劣:
通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
实例:
1. 饿汉式单例模式:直接类加载器初始化时new一个对象
public class SingleTon1 {
//直接初始化 private static SingleTon1 singleTon1 = new SingleTon1();
//私有构造方法 private SingleTon1() {
}
//共有,静态方法,供客户端调用 public static SingleTon1 getInstance() { return singleTon1; }
} |
2. 饱汉式:饱汉式单例模式:延迟初始化,第一次使用时初始化
public class SingleTon2 {
private static SingleTon2 singleTon2 = null;
private SingleTon2() {
}
/** * 非同步方式 * @return */ public static SingleTon2 getInstance() { if (singleTon2 == null) { singleTon2 = new SingleTon2(); } return singleTon2; }
/** * 同步:双重锁检查 * * @return */ public static SingleTon2 getInstance2() { if (singleTon2 == null) { synchronized (SingleTon2.class) { if (singleTon2 == null) { singleTon2 = new SingleTon2(); } } } return singleTon2; }
} |
3. 内部类:静态内部类方式的单例模式,只有在主动使用时才会初始化,
默认只会进行装载、链接,不会进行初始化阶段
public class SingleTon3 {
private SingleTon3() {
}
public static SingleTon3 getInstance() { return Factory.singleTon3; }
private static class Factory{ //被final修饰的变量,只有在主动使用,且是运行时常量时才初始化 private static final SingleTon3 singleTon3 = new SingleTon3(); } } |
4. 枚举:枚举来代替单例,其实枚举就是饱汉式的一种变种,相当于提供私有构造方法,然后new了多个实例,
public enum SingleTonEnum { instance;//相当于SingleTonEnum instance = new SingleTonEnum();
private SingleTonEnum() { } } |