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; } }