使用反射的Factory Pattern与Singleton Pattern的冲突问题

02-10-23 CrazyJavar
              

具体情况如下:

有个产品系

class X

{

...

}

class A extends X

{

...

}

class B extends X

{

...

}

同类的产品还有C, D, E...等等

该组类的责任是管理web app中的xml文件

为避免管理冲突,对其所有方法synchronized,并使用Singleton Pattern

使得每次都只有一个实例在work

现有工厂方法

class XFactory

{

public X getX(String key)

{

...

}

}

本来我根据传入的参数key生成具体的X系子类

if (key.equals("xxxxx")) then 方法

但是考虑X系的子类很多,于是改用反射,key就是类的全名

X = Class.forName(key).newInstance();

但问题是反射一定要求类的构造器不能private

因此就和X系类的Singleton Pattern冲突了

请教各位DP牛人

如何解决这个问题呢?

              

banq
2002-10-23 13:01

不一定要用singleton

使用reflect的方法定义static也可以啊。

CrazyJavar
2002-10-23 15:44

板桥大哥

小弟不是很明白你的话

可否写点关键代码看看

非常感谢

谢谢

CrazyJavar
2002-10-23 16:44

Reflection API 在运行时无法获取私有成员的值。

CrazyJavar
2002-10-23 16:44

package test;

import utilities.Recorder;

import java.lang.reflect.*;

public class Reflector

{

public static void main(String[] args)

{

try

{

Class targetClass = Class.forName("test.RF");

Method m = targetClass.getDeclaredMethod("out", null);

m.invoke(null, null);

}

catch (Exception e)

{

Recorder.myLog.debug("Caught an exception : ", e);

}

}

}

class RF

{

static void out()

{

Recorder.myLog.debug("RF.out()");

}

private SubRF()

{

Recorder.myLog.debug("new sub instance");

}

}

class SubRF extends RF

{

static void out()

{

Recorder.myLog.debug("SubRF.out()");

}

private SubRF()

{

Recorder.myLog.debug("new sub instance");

}

}

上面这个程序编译错误

因为构造器的权限为private

3Go 1 2 3 下一页