在软件系统中,经常有这样一些类,必须保证它们在系统中只有一个实例,才能确保它们的逻辑正确性,以及良好的效率。如何绕过常规的构造器(如new),提供一种机制来保证一个类只有一个实例,这就需要使用单例模式类实现。
通常,我们在实例化一个类的时候,使用new关键字,如:
Person person = new Person;
这样我们是站在使用者的角度来创建一个类的实例,而对于单例模式,创建一个类的实例是类设计者的责任,而不是类使用者的责任。
单例模式在《设计模式》GoF中的定义是:保证一个类只有一个实例,并提供一个该实例的全局访问点。设计一个类为单例,其类图如下:
Java中单例模式的三种实现方式如下
方式一:饿汉式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
};
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
方式二:懒汉式
public class Singleton2 {
private static Singleton2 instance = null;
private Singleton2() {
};
static {
instance = new Singleton2();
}
public static Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
方式三:
import java.util.HashMap;
import java.util.Map;
public class Singleton3 {
private static Map<String, Singleton3> map = new HashMap<String, Singleton3>();
static {
Singleton3 singleton = new Singleton3();
map.put(Singleton3.class.getName(), singleton);
}
protected Singleton3() {
}
public static synchronized Singleton3 getInstance(String name) {
if (name == null) {
name = Singleton3.class.getName();
System.out.println("name=null" + "--->name=" + name);
}
if (map.get(name) == null) {
try {
map.put(name, (Singleton3) Class.forName(name).newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return map.get(name);
}
}