单例模式
要点
- 某个类只能有一个实例
- 必须自行创建实例
- 必须自行向整个系统提供这个实例
实现
- 只提供私有的构造方法
- 含有一个该类的静态私有对象
- 提供一个静态的公有方法用于创建、获取静态私有对象
代码实现方案
饿汉式
package designPatterns.SingletonMode;
public class HungrySingletonMode {
private HungrySingletonMode(){
}
private static HungrySingletonMode hungrySingletonMode = new HungrySingletonMode();
public static HungrySingletonMode getInstance(){
return hungrySingletonMode;
}
}
- 饿汉式单例模式在私有对象创建过程中就已经实例化了,无论是否使用。
- 这是一种用空间换时间的模式,在类加载的时候静态实例对象就完成了初始化,使用的时候直接用就行了,不用再花时间初始化,当然,这个对象在加载时就创建了,所以存在的时间也比较长,对空间会有一定占用。
- 饿汉式单例模式是线程安全的,因为当多个线程访问的时候实例已经创建并初始化了,所以多个线程通过公有方法访问的对象也是唯一的。
懒汉式
package designPatterns.SingletonMode;
public class LazySingletonMode {
private LazySingletonMode(){
}
private static LazySingletonMode lazySingletonMode = null;
public static LazySingletonMode getInstance(){
if(lazySingletonMode == null){
lazySingletonMode = new LazySingletonMode();
}
return lazySingletonMode;
}
}
- 懒汉式单例模式,对象实例化在公共静态方法里进行,所以对象只有在用到的时候才会进行实例化。
- 这是一种用时间换空间的模式,在创建对象的时候不实例化,不会开辟空间,到用的时候才会判断是否已经实例化,如没有就进行实例化,会花费一定时间。
- 懒汉式单例模式是非线程安全的,类创建的对象在第一次使用时才会初始化,当多个线程创建访问时,由于时间片的切换,可能会出现线程风险。