电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

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


发布日期:2021/1/24
 

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

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

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

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

恶汉

Java代码

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

懒汉

Java代码

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;

}

}

注册型

Java代码

public class RegSingleton {

static private HashMap m_registry = new HashMap();

static {

RegSingleton x = new RegSingleton();

m_registryput(xgetClass()getName() x);

}

protected RegSingleton() {

}

static public RegSingleton getInstance(String name) {

if (name == null) {

name = name;

}

if (m_registryget(name) == null) {

try {

m_registryput(name ClassforName(name)newInstance());

} catch (Exception e) {

Systemoutprintln(Error happened);

}

}

return (RegSingleton) (m_registryget(name));

}

}

Java代码

public class RegSingletonChild extends RegSingleton {

private RegSingletonChild() {

}

/**

* 静态工厂方法

*/

static public RegSingletonChild getInstance() {

return (RegSingletonChild) RegSingletongetInstance(name);

}

}

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

Java代码

public class ConfigClass {

static private HashMap m_registry = new HashMap();

static {

ConfigClass x = new ConfigClass();

m_registryput(xgetClass()getName() x);

}

/**

* 保护的默认构造子

*/

protected ConfigClass() {

}

/**

* 静态工厂方法返还此类惟一的实例

*/

static public ConfigClass getInstance(String name) {

if (name == null) {

name = singleConfigConfigClass;

}

if (m_registryget(name) == null) {

try {

m_registryput(name ClassforName(name)newInstance());

} catch (Exception e) {

Systemoutprintln(Error happened);

}

}

return (ConfigClass) (m_registryget(name));

}

}

Java代码

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) ConfigClassgetInstance(singleConfigokConfigImpl);

}

/**

*

* @author xiaofengbai<BR>

* <B>Time</B> : 下午::

*/

public void updateProperties() {

ConfigImpl con = new ConfigImpl();

properties = congetProperties();

}

/**

* @author xiaofengbai<BR>

* <B>Time</B> : 下午::

*/

private void initalProperties() {

// 初始化配置信息

}

}

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

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

上一篇:校验值对象——应用Visitor模式和反射

下一篇:关于SOA 的五种资产重用最佳实践