【23种设计模式】单例模式
单例模式需要保证,构造方法一定是私有化的,并且类的全局变量必须是静态的,私有的;这样才能有唯一的实例化途径
懒汉式
错误代码一:
public class Singleton {
//如果不设置成静态的,无法在getInstance方法中直接引用
private Singleton singleton;
private Singleton(){ }
public static Singleton getInstance(){
/**
* 如果类的变量设计在这里,那么等于,每次调用这个方法,
* 都是在重新定义变量,并不符合单例模式的特征
* */
Singleton singleton = new Singleton();
return singleton;
}
}
上述方法,并没有把类变量singleton
设置为静态的,这样,如果想在getInstance方法中使用,则必须重新定义变量,并对其进行实例化,这样,类中的private Singleton singleton;
就无用了,同时,也就不能保证只有一个singleton
对象了。
错误代码二:
public class Singleton {
private Singleton singleton;
private Singleton singleton = new Singleton();
private Singleton(){ }
public static Singleton getInstance(){
Singleton singleton = new Singleton().singleton;
return singleton;
}
}
碰到判断题,看见这种写法,运行用==
测试了之后发现是true,顿时陷入了迷茫,后来经朋友提醒才发现,此时调用getInstance
赋值的对象其实是null,也就是null == null
饿汉式
class HungurySingleton {
private static HungurySingleton hungurySingleton = new HangurySingleton() ;
private HungurySingleton (){}
public HungurySingleton getInstance(){
return hungurySingleton;
}
}
饿汉式和懒汉式的区别在于懒汉式是使用时才进行加载,饿汉式是在类加载时已经加载好了的。