- 单例设计模式
即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。 - 单例模式特点:
单例类只能有一个实例:构造器私有化
单例类必须自己创建自己的唯一实例:含有一个该类的静态变量来保存这个唯一的实例
单例类必须给所有其他对象提供这一对象实例:对外提供获取该实例对象的方式①直接暴露②用静态变量的get方法获取。 - 单例模式常见的形式有: 懒汉式单例,饿汉式单例。
(1)饿汉式:直接创建对象,不存在线程安全问题
①直接实例化饿汉式
②枚举式
③静态代码块饿汉式
/**
* 构造器私有化
* 自行创建,并且用静态变量保存
* 向外提供这个实例
* 强调这是单例,可以用final修饰
*/
//①直接实例化饿汉式
public class Singleton1 {
public static final Singleton1 INSTANCE = new Singleton1();
private Singleton1(){}
}
/**
* 枚举类型,表示该类型限定的对象有几个
*/
public enum Singleton2 {
INSTANCE
}
public class Singleton3 {
public static final Singleton3 INSTANCE;
static {
INSTANCE = new Singleton3();
}
private Singleton3(){
}
}
(2)懒汉式:延迟创建对象
①线程不安全(适用于单线程)
②线程安全(适用于多线程)
③静态内部类形式(适用于多线程)
//线程安全的
public class Singleton5 {
private Singleton5(){}
private static Singleton5 instance;
public static Singleton5 getInstance(){
if(instance == null){
//加上同步锁
synchronized (Singleton5.class){
if(instance == null){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
instance = new Singleton5();
}
return instance;
}
}
return instance;
}
}
/**
* 在内部类被加载和初始化
*/
public class Singleton6 {
private Singleton6(){}
public static class inner{
private static final Singleton6 INSTANCE = new Singleton6();
}
public static Singleton6 getInstance(){
return inner.INSTANCE;
}
}