单例模式
单例模式,顾名思义代表了单独一个实例。一个类只有对象产生,并只提供一个访问对象的方法,典型的单身狗思想。
单例的不同情况
一个最简单的单例模式样例:
public class Singleton {
private static Singleton instance;
// private constructor
// 无法通过new关键字来获取新的实例
private Singleton() {
}
// 提供一个访问对象的方法
public static Singleton getInstance()
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
单例设计模式意味着Java虚拟机里只能有一个类对象,我们知道Java可以通过new、clone和reflection来实例化一个类对象,要想实现单例模式,在使用不同方式实例化类对象是需要满足不同约束条件。
- new:如上例子所示,我们将类的构造器私有化,即private constructor
- clone:继承java.lang.Clonable接口并重写clone()方法让其返回与类相同的单例对象
- reflection:使用枚举,但不支持延迟初始化
上面的例子针对了new关键字,下面再来看看clone和reflection对应的情况。
首先是clone,clone的概念是创造重复的对象,得到对象的复制对象。假设我们创建了一个单例对象的clone,这样的话单例类就有两个对象,因此不能再称为单例对象。
public class SingletonClone {
public static void main(String[] args) throws CloneNotSupportedException {
Singleton instance1 = Singleton.instance;
Singleton instance2 = (Singleton) instance1.clone();
System.out.println("instance1的hashcode是" + instance1.hashCode());
System.out.println("instance2的hashcode是" + instance2.hashCode());
}
}
class SuperClass implements Cloneable {