Chinaunix首页 | 论坛 | 博客
  • 博客访问: 485969
  • 博文数量: 111
  • 博客积分: 3146
  • 博客等级: 中校
  • 技术积分: 939
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-07 11:23
个人简介

Nathing

文章分类

全部博文(111)

文章存档

2016年(2)

2015年(1)

2014年(31)

2012年(2)

2011年(9)

2010年(36)

2009年(30)

我的朋友

分类: Java

2010-11-06 11:39:31

1.定义
单例模式是对象的创建模式的一种,它保证一个类有且只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类则称为单例类。
2.使用场合
简而言之,就是任何只需要一个实例的地方.例如,窗口管理器,假脱机打印设备,数据库连接池。具体应用中,配置信息类,管理类,控制类,门面类,代理类通常被设计为单例类.
(1)配置信息类
负责配置文件的解析,通常被设计为单例类
(2)管理类
如连接池管理类,通常被设计为单例类
(3)控制类
如struts的ActionServlet类,也是单例类。
如下,只需在web.xml配置以下ActionServlet,tomcat容器自动装载后,即可完成对整个web系统提供ActionServlet实例。
Java代码:

<servlet>

    <servlet-name>action</servlet-name>

    <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> </servlet>

<servlet-mapping>

    <servlet-name>action</servlet-name>

    <url-pattern>*.do</url-pattern>

</servlet-mapping>

(4)门面类
说到门面类,就不能不提门面(Facade)模式。客户端与多个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。这个统一的门面(Facade)对象就是门面类。在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。但这不是绝对的。
(5)代理类
在Jive中,使用代理模式实现权限访问的入口,就采用了单例模式。
3.单例模式在Java语言的实现
单例模式在Java语言的实现上有三种情况:饿汉式单例类,懒汉式单例类,登记式单例类。
(1)饿汉式单例类
饿汉式单例类饿汉式单例类是在Java 语言里实现得最为简便的单例类。在类被加载时,就会将自己实例化。
Java代码:

public class Singleton2
{
    //注意这是private
    private static Singleton2 theInstance = new Singleton2();
    //这里提供了一个供外部访问本class的静态方法,可以直接访问
    public static Singleton2 getInstance()
    {
        return theInstance;
    }
}

(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;
    }
}

(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 = "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代码:

public class RegSingletonChild extends RegSingleton
{
    public RegSingletonChild()
    {
    }

    static public RegSingletonChild getInstance()
    {
        return (RegSingletonChild) RegSingleton.getInstance("RegSingletonChild");
    }

    public String about()
    {
        return "Hello, I am RegSingletonChild.";
    }
}


单例特点
1).私有的静态的成员变量
2).私有的构造方法
3).公共的静态的入口点方法
阅读(769) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~