`
bxf12315
  • 浏览: 27144 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

可更新的注册式的单实例模式

阅读更多

       最近,遇到这样一个应用。在系统中需要大量的配置信息,为了不每次都找数据库或者配置文件。需要一个生命周期和App一样的容器(=静态变量),但是在配置信息被修改时还需要去更新这个容器。

 

      首先选用的是单实例模式。单实例模式中又可分为恶汉,懒汉,以及一种基于饿汉型的注册型。

      个人感觉懒汉型单例模式没什么,而饿汉型的更能体现java特点。然注册行的可扩展性较强,个人感觉有点像

       一个实例工厂.下面来一一列举。

 

恶汉:

 

public class EagerSingleton {
    private static final EagerSingleton m_instance = new EagerSingleton();

    private EagerSingleton() {
    }

    public static EagerSingleton getInstance() 
        {


        return m_instance; 
        }
}

 

懒汉:

public class LazySingleton {

    private static LazySingleton m_instance = null;

    private LazySingleton() {
    }

    synchronized public static LazySingleton getInstance() {
        if (m_instance == null) {
            m_instance = new LazySingleton();
        }
        return m_instance;
    }
}

      

注册型:

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 = "name";
        }
        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 RegSingletonChild extends RegSingleton {

    private RegSingletonChild() {
    }

    /**
     * 静态工厂方法
     */
    static public RegSingletonChild getInstance() {
        return (RegSingletonChild) RegSingleton.getInstance("name");
    }

}

 

由于在我们这个系统中各种配置信息较多,我个人感觉使用注册型的单实例模式比较合适。(还能应付对配置信息变化的要求)。然后就需要给我们的单实例模式添加更新的行为了。

 

public class ConfigClass {
    static private HashMap m_registry = new HashMap();
    static {
        ConfigClass x = new ConfigClass();
        m_registry.put(x.getClass().getName(), x);
    }

    /**
     * 保护的默认构造子
     */
    protected ConfigClass() {
    }

    /**
     * 静态工厂方法,返还此类惟一的实例
     */
    static public ConfigClass getInstance(String name) {
        if (name == null) {
            name = "singleConfig.ConfigClass";
        }
        if (m_registry.get(name) == null) {
            try {
                m_registry.put(name, Class.forName(name).newInstance());
            } catch (Exception e) {
                System.out.println("Error happened.");
            }
        }
        return (ConfigClass) (m_registry.get(name));
    }
}
public class ConfigImpl extends ConfigClass {

 private List properties = null;

    /**
     * @return the properties
     */
    public List getProperties() {
        return properties;
    }

    private ConfigImpl() {

        initalProperties();
    }

    public static ConfigImpl getInstance() {
        return (ConfigImpl) ConfigClass.getInstance("singleConfig.ok.ConfigImpl");
    }

    /**
     * 
     * @author xiaofeng.bai<BR>
     * <B>Time</B> : 2008-12-11 下午01:59:24
     */
    public void updateProperties() {
        ConfigImpl con = new ConfigImpl();

        properties = con.getProperties();
    }

    /**
     * @author xiaofeng.bai<BR>
     * <B>Time</B> : 2008-12-11 下午01:56:53
     */
    private void initalProperties() {
        // 初始化配置信息
    }
}

 

呵呵终于完成了,但是现在发现一个问题很晕。我在ConfigImpl中的updateProperties()中有创建了一个ConfigImpl的实例,这样能完成我对properties的更新吗?

单实例顾名思义在一个JVM中只有一个实例,这样是否可行呢?

 

 

分享到:
评论
4 楼 fmjasper 2009-04-11  
你确定这个程序能通过? 不会跑出access exception, 注册式的singleton, 子类的constructor必须是public
3 楼 chian_xxp 2009-04-10  
能否请楼主简要介绍下RegSingleton 类中static private的用意。实在看不明白,这样的修饰有什么特别的用意吗?

在jdk source中,也发现File.java中也出现这样的用法。
2 楼 new20080601 2009-01-07  
public void updateProperties() { 
  
    } 
这个方法不要呀也可以
在测试,类里用

Config con = new (ConfigImpl)       ConfigClass.getInstance("singleConfig.ok.ConfigImpl");

  con .getProperties()
应该就确保一个了吧
1 楼 new20080601 2009-01-07  
和java与模式 那里很像呀。。。。
只是
public void updateProperties() { 
        Config con = new (ConfigImpl)       ConfigClass.getInstance("singleConfig.ok.ConfigImpl");  //改成这样呢? 随便说说的
 
        properties = con.getProperties(); 
    } 
 
    /**
     * @author xiaofeng.bai<BR>
     * <B>Time</B> : 2008-12-11 下午01:56:53
     */ 
    private void initalProperties() { 
        // 初始化配置信息 
    } 
这个没有,(*^__^*) 嘻嘻……,新手报道

相关推荐

    一例读懂设计模式-单例模式、简单工厂模式.zip

    本资源“一例读懂设计模式-单例模式、简单工厂模式.zip”旨在帮助初学者通过实例深入理解这两种重要设计模式:单例模式和简单工厂模式。以下是关于这两个模式的详细讲解。 1. **单例模式**: 单例模式是一种限制类...

    根据不同的模式创建单实例应用程序(3kb)

    5. **登记式单例模式**:通过注册到某个全局容器(如工厂、服务定位器)来管理单例,这种方式更加灵活,但可能会增加系统的复杂性。 `SingleInstance.cpp`可能包含了单例类的实现,而`SingleInstance.h`则包含了类...

    观察者模式本质实例DEMO

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计模式中的行为模式之一,主要用于在对象之间建立一种一对多的依赖关系...总的来说,观察者模式是一种强大的工具,帮助我们构建响应式和灵活的系统。

    几种单例模式说明(并有实例)

    登记式单例模式又称为注册式单例模式,它使用一个注册表(通常为HashMap)来管理所有单例对象。当需要某个单例对象时,先检查注册表中是否存在,如果不存在则创建并加入到注册表中。 #### 示例代码分析 ```java ...

    Observer设计模式实例

    总结来说,Observer设计模式是软件设计中的重要工具,它帮助我们创建响应式、可扩展的系统。理解和熟练运用Observer模式,对于提升软件质量和可维护性具有重要意义。在Java、C#、Python等面向对象语言中,都有内置的...

    22种开发模式

    单类模式实现了类似 C 语言中全局变量的功能,单类模式常用于注册/查找的服务。 单类模式有两种实现方式:饱汉模式和饿汉模式。饱汉模式是指在类加载时就创建实例对象,而饿汉模式是指在第一次使用时创建实例对象。...

    Java单例模式.pdf

    在注册式单例中,有一个静态的注册表(在本例中是一个Map)用于存储类的实例。通过使用注册表,可以方便地在运行时注册新的实例或者获取已存在的实例。通过getInstance方法,首先检查注册表中是否已经有该类的实例,...

    将工厂模式升华为插件式框架文章源代码

    工厂模式通过将实例化过程封装在单个类中,使得客户端无需知道具体对象的创建逻辑,仅需调用工厂方法即可得到所需产品。然而,随着系统复杂度的提升,单一的工厂模式可能无法满足动态扩展的需求,这时就需要将其升华...

    .net mvc5注册实例

    在".net mvc5注册实例"中,我们将探讨如何使用.NET MVC5实现一个用户注册功能,同时引入jQuery和Bootstrap以提升用户体验。 首先,让我们了解.NET MVC5的基本架构。MVC模式包含三个主要组件:模型(Model)、视图...

    二十三种设计模式【PDF版】

    特别是中国传统建筑,那是很讲模式的,这些都是传统文化使然,比如京剧 一招一式都有套路;中国画,也有套路,树应该怎么画 法?有几种画法?艺术大家通常是创造出自己的套路,比如明末清初,水墨画法开始成熟,这时画树就不用...

    java设计模式之观察者模式

    Java设计模式是软件开发中的重要概念,它们是解决常见编程问题的经验总结,使得代码更加可复用、可扩展和易于维护。观察者模式(Observer Pattern)是这些模式中的一种,它在多对一的关系中使用,当一个对象的状态...

    初探Delphi模式编程

    在Delphi中,命令模式常用于实现命令式用户界面,使得用户操作可以被记录、回放和撤销。 9. **状态模式**: 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。在Delphi中,状态模式常...

    java单例设计模式的好处

    - **登记式单例**:也称为注册式单例,它维护一个存储单例对象的集合,当需要实例时,首先检查集合中是否存在,存在则直接返回,不存在则创建并添加到集合中。这种方式更加灵活,可以管理一组单例对象,但实现相对...

    java 开发模式用例

    在Java开发中,应用设计模式可以提高代码的可读性、可维护性和可扩展性。以下是对标题“java开发模式用例”中涉及的三个主要设计模式——单例模式、观察者模式和汽车工厂模式的详细解释。 **单例模式**: 单例模式...

    Java的事件模式Java的事件模式

    Java 1.4引入的非阻塞I/O(None Blocking I/O)是一个典型的监控式事件模式的例子,其中Selector作为监控器,能够监视多个通道(Channels)的事件,如连接请求、数据可读等,从而提高并发处理能力。 在服务器端...

Global site tag (gtag.js) - Google Analytics