[Java基础知识] [Java高级编程] [Java网络编程] [J2EE]
 [开发工具] [中间件] [Web开发] [J2ME] [JSP] [Web开发]
 [Java与数据库] [Java开源] [设计模式] [在线文档]
下载中心
[Java教程] [开发工具] [代码源码]
[Oracle数据库] [视频教程]

讲解JAVA设计模式中的单例模式 (2)

发布时间:2008-3-23 21:05:40     来源:赛迪网    作者:赛迪网

 

(2)懒汉式单例类

与饿汉式单例类不同的是,懒汉式单例类在第一次被引用时将自己实例化。

Java代码:

public class Singleton {      
    public static Singleton theInstance = null;      
    private Singleton(){}      
    public synchronized static Singleton instance(){     
        if(theInstance == null){     
            return new Singleton();     
        }     
        return theInstance;     
    }      
}    
   

public class Singleton {   
    public static Singleton theInstance = null;   
    private Singleton(){}   
    public synchronized static Singleton instance(){  
        if(theInstance == null){  
            return new Singleton();  
        }  
        return theInstance;  
    }   
}

(3)登记式单例类

登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。

Java代码:

public class RegSingleton     
{     
    static private HashMap m_registry = new HashMap();     
    static     
    {     
        RegSingleton x = new RegSingleton();     
        m_registry.put(x.getClass().getName(), x);     
    }      
    protected RegSingleton(){      
    }      
    static public RegSingleton getInstance(String name)     
    {     
        if (name == null)     
        {     
            name = "com.javapatterns.singleton.demos.RegSingleton";     
        }     
        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 class RegSingleton  
{  
    static private HashMap m_registry = new HashMap();  
    static  
    {  
        RegSingleton x = new RegSingleton();  
        m_registry.put(x.getClass().getName(), x);  
    }   
    protected RegSingleton(){   
    }   
    static public RegSingleton getInstance(String name)  
    {  
        if (name == null)  
        {  
            name = "com.javapatterns.singleton.demos.RegSingleton";  
        }  
        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));  
    }   
}

登记式单例类的子类

Java代码:

import java.util.HashMap;   
public class RegSingletonChild extends RegSingleton   
{   
public RegSingletonChild() {}   
static public RegSingletonChild getInstance()   
{   
return (RegSingletonChild)   
RegSingleton.getInstance(   
"com.javapatterns.singleton.demos.RegSingletonChild" );   
}   
  
public String about()   
{   
return "Hello, I am RegSingletonChild.";   
}   
}

(责任编辑:卢兆林)


发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
  相关文章
   
  • 上一个JAVA文章:

  •  
  • 下一个JAVA文章: 没有了
  •        
      网友评论
      精彩友情推荐  

  • 关于我们 | 版权申明 | 网站地图 | 广告指南 | 友情链接 | 联系我们
  • Copyright (C) 2003-2008 Javafan.net, All Rights Reserved 版权所有 Java爱好者 京ICP备05010995号