单例设计模式
1.某个类只能有一个实例
构造器私有化
2.它必须自行创建这个实例
含有一个该类的静态变量来保存这个唯一的实例
3.它必须自行向整个系统提供这个实例
对外提供获取该实例对象的方式。
常见的有如下几种形式:
1.饿汉式:在类初始化时直接创建对象,不存在线程安全问题。
public class Singleton {
//自行创建,并用静态变量保存
final static Singleton INSTANCE = new Singleton1();//直接创建,不管是否需要此对象
//构造器私有化
private Singleton1(){
}
}
2.懒汉式:延迟创建对象
2.1 线程不安全,适用于单线程
public class Singleton1 {
static Singleton1 instance;//用静态变量保存这个唯一的实例
private Singleton1(){// 静态方法私有化
}
public static Singleton1 getInstance(){//提供一个静态方法,获取这个实例
if(instance == null){
instance = new Singleton1();
}
return instance;
}
}
2.2 线程安全(适用于多线程)
public class Singleton1 {
static Singleton1 instance;//用静态变量保存这个唯一的实例
private Singleton1(){// 静态方法私有化
}
public static Singleton1 getInstance(){//提供一个静态方法,获取这个实例
if(instance == null) { //如果没有创建,否则,不执行
synchronized (Singleton1.class) { //加上同步 Singleton1.class为线程锁
if (instance == null) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
instance = new Singleton1();
}
}
}
return instance;
}
}
- 枚举式:表示该类型的对象是有限的几个,我们可以限定为一个,就成了单例,枚举类型的构造器都是私有化的。
public enum Sington2 {
INSTANCE
}
4.静态内部类:在内部类被加载和初始化的时候,才创建对象,静态内部类不自动随着内部类的加载和初始化而初始化,它是单独去加载和初始化的(线程安全)
public class Sington2 {
//私有的构造方法
private Sington2(){
}
//私有的静态内部类
private static class Inner{
private static final Sington2 INSTANCE = new Sington2();
}
public static Sington2 getInstance(){
return Inner.INSTANCE;
}
}