1) 单例类只能有一个实例
2) 单例类必须自己创建自己的唯一的实例
3) 单例类必须给所有其他对象提供这一实例
1、 饿汉式单例类:
public class EagerSingleton{
private static final EagerSingleton m_instance=new EagerSingleton();
private EagerSingleton(){
}
public static EagerSingleton getInstance(){
return m_instance;
}
}
2、 懒汉式单例式:
public class LazySingleton{
private static LazySingleton m_instance=null;
private LazySington(){
}
synchronized public static LazySingleton getInstance(){
if(m_instance==null){
m_instance=new LazySingleton();
}
return m_instance;
}
}
3、 登记式单例类(GOF)为了克服饿汉式单例类及懒汉式单例类均不能继承的缺点而设计的
public class RegSingleton{
static private HashMap m_registry=new HashMap();
static{
RegSingleton x=new RegSingleton();
m_registry.put(x.getClass().getName(),x);
}
protected RegSington(){
}
static public RegSingleton getInstance(String name){
if(name==null){
>
}
if(m_registry.get(name)==null)
{
try{
m_registry.put(name,Class.forName(name).newInstance());
}catch(Exception e){
System.out.println(“Error happened.”);
}
}
return (RegSingleton)(m_registry.get(name));
}
public String about(){
return “Hello,I am RegSingleton.”;
}
}
其子类的源代码是
public class RegSingletonChild extends RegSingleton{
public RegSingletonChild(){}
static public RegSingletonChild getInstance(){
return (RegSingletonChild)RegSingleton.getInstance(“com.javapatterns.singleton.demos.RegSingletionChild”);
}
public String about(){
return “Hello,I am RegSingletonChild”;
}
}
4、使用单例模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。