最近,遇到这样一个应用。在系统中需要大量的配置信息,为了不每次都找数据库或者配置文件。需要一个生命周期和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中只有一个实例,这样是否可行呢?
分享到:
相关推荐
本资源“一例读懂设计模式-单例模式、简单工厂模式.zip”旨在帮助初学者通过实例深入理解这两种重要设计模式:单例模式和简单工厂模式。以下是关于这两个模式的详细讲解。 1. **单例模式**: 单例模式是一种限制类...
5. **登记式单例模式**:通过注册到某个全局容器(如工厂、服务定位器)来管理单例,这种方式更加灵活,但可能会增加系统的复杂性。 `SingleInstance.cpp`可能包含了单例类的实现,而`SingleInstance.h`则包含了类...
观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计模式中的行为模式之一,主要用于在对象之间建立一种一对多的依赖关系...总的来说,观察者模式是一种强大的工具,帮助我们构建响应式和灵活的系统。
登记式单例模式又称为注册式单例模式,它使用一个注册表(通常为HashMap)来管理所有单例对象。当需要某个单例对象时,先检查注册表中是否存在,如果不存在则创建并加入到注册表中。 #### 示例代码分析 ```java ...
总结来说,Observer设计模式是软件设计中的重要工具,它帮助我们创建响应式、可扩展的系统。理解和熟练运用Observer模式,对于提升软件质量和可维护性具有重要意义。在Java、C#、Python等面向对象语言中,都有内置的...
单类模式实现了类似 C 语言中全局变量的功能,单类模式常用于注册/查找的服务。 单类模式有两种实现方式:饱汉模式和饿汉模式。饱汉模式是指在类加载时就创建实例对象,而饿汉模式是指在第一次使用时创建实例对象。...
在注册式单例中,有一个静态的注册表(在本例中是一个Map)用于存储类的实例。通过使用注册表,可以方便地在运行时注册新的实例或者获取已存在的实例。通过getInstance方法,首先检查注册表中是否已经有该类的实例,...
工厂模式通过将实例化过程封装在单个类中,使得客户端无需知道具体对象的创建逻辑,仅需调用工厂方法即可得到所需产品。然而,随着系统复杂度的提升,单一的工厂模式可能无法满足动态扩展的需求,这时就需要将其升华...
在".net mvc5注册实例"中,我们将探讨如何使用.NET MVC5实现一个用户注册功能,同时引入jQuery和Bootstrap以提升用户体验。 首先,让我们了解.NET MVC5的基本架构。MVC模式包含三个主要组件:模型(Model)、视图...
特别是中国传统建筑,那是很讲模式的,这些都是传统文化使然,比如京剧 一招一式都有套路;中国画,也有套路,树应该怎么画 法?有几种画法?艺术大家通常是创造出自己的套路,比如明末清初,水墨画法开始成熟,这时画树就不用...
Java设计模式是软件开发中的重要概念,它们是解决常见编程问题的经验总结,使得代码更加可复用、可扩展和易于维护。观察者模式(Observer Pattern)是这些模式中的一种,它在多对一的关系中使用,当一个对象的状态...
在Delphi中,命令模式常用于实现命令式用户界面,使得用户操作可以被记录、回放和撤销。 9. **状态模式**: 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。在Delphi中,状态模式常...
- **登记式单例**:也称为注册式单例,它维护一个存储单例对象的集合,当需要实例时,首先检查集合中是否存在,存在则直接返回,不存在则创建并添加到集合中。这种方式更加灵活,可以管理一组单例对象,但实现相对...
在Java开发中,应用设计模式可以提高代码的可读性、可维护性和可扩展性。以下是对标题“java开发模式用例”中涉及的三个主要设计模式——单例模式、观察者模式和汽车工厂模式的详细解释。 **单例模式**: 单例模式...
Java 1.4引入的非阻塞I/O(None Blocking I/O)是一个典型的监控式事件模式的例子,其中Selector作为监控器,能够监视多个通道(Channels)的事件,如连接请求、数据可读等,从而提高并发处理能力。 在服务器端...