设计模式17:单例模式
单例模式就是说系统中对于某类的只能有一个对象,不可能出来第二个。
static修饰的方法,不能再用abstract修饰,也不能Override。这是因为static方法是属于类的,不会被继承。
最基本的单例模式不是线程安全的,当有多个线程同时getInstance时,有可能实例化了多个对象。
下面比较单例模式的几种实现方式的优缺点:
Hungry模式:
public class HungrySingleton{ static HungrySingleton instance = new HungrySingleton(); private HungrySingleton(){ } public static HungrySingleton getInstance(){ return instance; } }
这种模式当类被加载时,创建一个实例。当系统中这样的类较多时,会使得启动速度变慢 。现在流行的设计都是讲“延迟加载”,我们可以在第一次使用的时候才初始化第一个该类对象。所以这种适合在小系统。
Lazy模式1:
public class LazySingleton1 { static LazySingleton1 instance; private LazySingleton1(){ } public synchronized static LazySingleton1 getInstance(){ if(instance == null){ instance = new LazySingleton1(); } return instance; } }
上述代码中的一次锁住了一个方法, 这个粒度有点大 ,改进就是只锁住其中的new语句就OK。就是所谓的“双重锁”机制。
Lazy模式2:
public class LazySingleton2 { static LazySingleton2 instance; private LazySingleton2(){ } public static LazySingleton2 getInstance(){ if(instance == null){ synchronized (LazySingleton2.class) { if(instance == null){ instance = new LazySingleton2(); } } } return instance; } }