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

CrazyJavar 02-10-23
              

具体情况如下:

有个产品系
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 下一页