Java设计模式
单例模式
单例类的定义是:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类
单例模式的特点:
单例类只能有一个实例
单例类必须自己创建自己的唯一实例
单例类必须给所有其他对象提供这一实例
在JAVA中一个类如果需要符合以上条件,就必须满足:
单例类只能有一个实例,那么在返回实例的时候,必须返回指定的那一个实例,所以在类中需要定义这个实例。
单例类自己创建自己的唯一实例,那么构造方法必须是私有的,这样在类之外就无法访问构造方法。
单例类必须给所有其他对象提供这一实例,那么类中必须要有公有的返回单个实例的方法。
满足了上面的条件,那么要考虑的就是如何实现,单例类只能有一个实例了。
饿汉模式:
是指在类加载的时候就创建一个实例,在需要的时候直接返回,这样就省去了在使用时构造的过程
public class EagerSingleton {
private static EagerSingleton instance = new EagerSingleton();
private EagerSingleton(){
}
public static EagerSingleton getInstance(){
return instance;
}
}
懒汉模式:
是指在使用的时候才创建它的实例,那么就有一个同步的问题,如果两个线程同时创建它的实例,那么就有可能同时调用它生产实例的方法,导致出现2个实例。
为了解决这个问题,可以在创建实例的时候加上锁,使得只有一个线程创建实例。
public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton(){}
public static synchronized LazySingleton getInstance(){
if(instance == null){
instance = new LazySingleton();
}
return instance;
}
}
上面这种写法又会有一个问题,在方法上加synchronized会降低效率,多个线程同时获取对象的时候,只有一个线程可以成功创建,其他的会阻塞。
那么为了增加效率,可以将synchronized加到方法内部的代码块上:
public class Singleton {
private volatile static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
另外,根据java static关键字的特性,可以使用静态 内部类来实现只创建一个实例。
public class SSingleton {
private SSingleton(){ }
private static class SingletonHolder{
private static SSingleton instance = new SSingleton();
}
public static SSingleton getInstance(){
return SingletonHolder.instance;
}
}
浙公网安备 33010602011771号