关于动态的创建对象,这样的该怎么实现?谢谢。

betterjonah 2003-10-09 12:06:20
问题是这样的。
有一个总控制器,负责创建对象,而他所要创建的对象是不确定的,在控制器运行时,有可能添加一个新的类,如何做才能在总控制器运行的情况下,在新类添加的情况下,能够创建新类对象?谢谢。退一步重起总控程序也行。但总控程序不能修改。

例如:
总空程序conrol.class运行
当前有a.class,b.class他就创建对象a,b.
此时添加c.class
要求能够创建对象c.

...全文
186 点赞 收藏 23
写回复
23 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
betterjonah 2003-10-14
那该怎么做呢?
回复
betterjonah 2003-10-10
to iamwls(我想天是我) ,配置文件由该怎么用呢?
回复
YanbinQiu 2003-10-10
如果你要做成万能工厂,工厂方法就直接返回Object,不过好象太泛都没多大意义了。
回复
shipp 2003-10-10
UP
U*P
回复
iamwls 2003-10-10
总控制器又叫万能工厂,哈哈,如果你是高手,不要用这个模式
回复
iamwls 2003-10-10
你说的是一个可插拔组件的实现

建议你使用配置文件

另,你要实现的是一个IDE的界面吗?如果是,可参考SUN 的 BEANINFO 相关规范
回复
YanbinQiu 2003-10-10
// O.java
//标识接口O,抽象产口,共同的基类
//也可以是一个抽象类,可带有初始实现

interface O{
}

//Control.java
//工厂类,简单工厂省去的抽象工厂,直接用它的静态工厂方法创建类

public class Control{
public static O factory(String className)
throws Exception{
return (O)Class.forName(className).newInstance();
}
}

//Client.java
//客户操作,进行对象的动态创建

public class Client{
public static void main(String[] args)
throws Exception{
A a=(A)Control.factory("A");
B b=(B)Control.factory("B");
C c=(C)Control.factory("C");
}
}

//A.java
//产品A

public class A implements O{
public A(){
System.out.println("A is created.");
}
}

//B.java
//产品B

public class B implements O{
public B(){
System.out.println("B is created.");
}
}

//C.java
//产品C

public class C implements O{
public C(){
System.out.println("C is created.");
}
}

类似产品A,B,C必须实现接口O,就是要有一个共同的基类
以类似结构可以衍生更多的O的实例

当你发现有这个需要了,就可以去看看设计模式方面的书了
这里就体现了多态性了。
回复
iamwls 2003-10-10

您很聪明,这就是万能工厂,看出了它的问题

所以,我不推荐使用

我也是学来的,继续学习中。。。

回复
YanbinQiu 2003-10-10
to iamwls(我想天是我)

试想,你要创建一个 “妓女” 族对象,你增加了那些具体类,难道还要去修改你的万能工厂类,加入方法“get妓女”吗?那还能叫万能吗?
回复
iamwls 2003-10-10
re: kypfos(深圳不是我的家)

给你举个例子讲讲万能工厂的实现(不推荐使用万能工厂)

万能是把系统里所有跟工厂相关的类做成一个类

你有做萝卜工厂+ 巧克力工厂+ 狗屎工厂 = 万能工厂


class 万能工厂TestClient
{
public static void main(String args[])
{
罗卜 lb = 万能工厂.get萝卜("红罗卜");
屎 s = 万能工厂.get狗屎("红狗屎");
巧克力工厂 qkl = 万能工厂.get巧克力("苦");
}


}

回复
YanbinQiu 2003-10-10
楼上这个问题有意思,Class.forName()返回的是一个Object的直接实例,它不能用
(A)NewObject的形式转换,而只能用(newClass)NewObject来进行操作,不过我想java作为一种强类型的语言这种动态创建的形式应该是不允许的,就像java的没有像php中的那种动态变量名一样"${${$abc}}",php中的这种形我还没有在其他的语言中看到过。对于产生的这种变量很难去引用,让GC也不好处理。

楼上的朋友,希望你研究出来了,告诉一下我!
回复
jokerjava 2003-10-10
String A = "newClass";
try {
Object o = Class.forName(A).newInstance();
} catch (Exception ex) {
ex.printStackTrace();
}
回复
fqyd2000 2003-10-10
public class Client{
public static void main(String[] args)
throws Exception{
A a=(A)Control.factory("A");
B b=(B)Control.factory("B");
C c=(C)Control.factory("C");
}
}
想问一下贴这段代码的朋友,既然类文件是动态增加的,要动态创建类的对象,就必须知道类的名字,假设已经知道类的名字,存储在字符串A中,例如String A = "newClass",那么如何用这个字符串声明引用来引用动态创建的新对象?
回复
YanbinQiu 2003-10-10
to iamwls
万能工厂返回Object的子类,你必须让要创建的对象都是继承或实现你所说的那个子类

而Object是根类,直接返回Object则可以创建任何类

Class就应该是一个万能工厂。
回复
iamwls 2003-10-10
re: kypfos(深圳不是我的家)

万能工厂不是万能method,可以返回Object的子类

re: betterjonah(jonah)

也不用什么特殊的用法,和一般的xml或是属性文件,文本都一样用
回复
YanbinQiu 2003-10-10
配置文件可以用Properties的load(),或者用ResourceBundle
参考相应的API吧。
回复
207 2003-10-10
学习
回复
alienbat 2003-10-09
这种文件级的加载很笨拙,做什么程序要用这种办法?没有其他解决方法吗?
回复
廖雪峰 2003-10-09
你自己写一个类继承自ClassLoader就可以动态加载class文件
回复
LoveRose 2003-10-09
control运行时就应该搜索当前目录下的class文件,并取得文件名
然后截去".class"取得类名,创建类的实例。
回复
发帖
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2003-10-09 12:06
社区公告
暂无公告