有一个用简单工厂模式遇到的问题,很急啊
有一个用简单工厂模式遇到的问题,很急啊
楼主visionsky(visionsky)2004-03-25 13:10:21 在 Java / 架构、设计 提问 fruit.java
package com.javapatterns.simplefactory;
public interface Fruit
{
void grow();
void harvest();
void plant();
}
Apple.java
package com.javapatterns.simplefactory;
public class Apple implements Fruit
{
public void grow()
{
System.out.println("Apple is growing...");
}
public void harvest()
{
System.out.println("Apple has been harvested.");
}
public void plant()
{
System.out.println("Apple has been planted.");
}
public int getTreeAge(){ return treeAge; }
public void setTreeAge(int treeAge){ this.treeAge = treeAge; }
private int treeAge;
}
FruitGardener.java
package com.javapatterns.simplefactory;
public class FruitGardener
{
public static Fruit factory(String which) throws BadFruitException
{
if (which.equalsIgnoreCase("apple"))
{
return new Apple();
}
else if (which.equalsIgnoreCase("strawberry"))
{
return new Strawberry();
}
else if (which.equalsIgnoreCase("grape"))
{
return new Grape();
}
else
{
throw new BadFruitException("Bad fruit request");
}
}
}
mainrun.java
package com.javapatterns.simplefactory;
public class mainrun{
public static void main( String[] args )
{
System.out.println("Main running");
Fruit f = null ;
try
{
f= FruitGardener.factory("apple");
f.grow();
if(f instanceof Apple)
System.out.println("Apple");
f.setTreeAge(1000);
}
catch(BadFruitException e)
{
System.out.println("Main running1111");
}
}
}
f是Apple类的instance,为什么不能用Apple类中的setTreeAge方法呢
问题点数:0、回复次数:16Top
1 楼jk3278jk(←■【编程先锋】★★★★★★★★★★)回复于 2004-03-25 15:10:04 得分 0
因为你的类工厂FruitGardener返回的是一个Fruit(父类) ,他没有setTreeAge方法。自然你的apple不能使用setTreeAge了!Top
2 楼visionsky(visionsky)回复于 2004-03-25 15:40:36 得分 0
可是f的确是Apple的实例
如果按照楼上的怎么说
工厂模式返回的类的实例,只能是使用接口定义的方法是吗?
那这样不是有点不方便Top
3 楼arkang168(arkang)回复于 2004-03-25 15:52:37 得分 0
在客户端调用时应该
Apple f = (Apple)FruitGardener.factory("apple");Top
4 楼cooldoghuang(98753210)回复于 2004-03-25 16:52:03 得分 0
楼主的问题不是模式的问题,是inherit和override的问题,建议楼主先找本java的语法书看一看,补一下基础,否则以后会遇到很多问题。Top
5 楼programer23(亮子)回复于 2004-03-25 18:01:08 得分 0
因为他是父类引址,它不可以用子类有而父类没有的方法。
他的类型向上转了!!Top
6 楼tydaniel(Bear)回复于 2004-03-25 18:20:10 得分 0
各位问个问题:
1。可以看出这是《Java与模式》的例子,SimpleFactory中的方法是Static Mehtod,而Factory Method Pattern中对Factory进行了进一步细化。但是我这个创建对象地过程中还是不可避免的要在Client程序中改动,为什么说这是符合OCP???? 还有如何避免这么多的IF...ELSE判断语句?是不可避免的吗?那泛型提出来是干吗?我对这概念不明白。
2。如果我事先不知道客户端要创建多少个对象,让他自己控制Instance的数量,只有用 Vector或其他集合类实现吗?如果我想做个Container,其中存放Client创建的Instance,如何能快速根据的Client传过来的信息对这个Instance调用其中的方法(注:我的前台是Flash MX,传递给Server的都是XML,我要根据其中的属性信息判断哪个对象哪个操作有些什么参数),同时写的IF....ELSE最少。
谢谢指教了,请MAIL:tydaniel@citiz.netTop
7 楼ladofwind(随风)回复于 2004-03-25 18:24:13 得分 0
把返回的强制转型成需要的子类型就行了
Top
8 楼Polarislee(北极星)(无房无车,飘在北京)回复于 2004-03-26 10:36:53 得分 0
我的观点是,如果产生的对象需要强制转换才能正确使用,那么就根本不适合使用Factory模式,Factory模式是为了将接口同实现解耦而使用的,如果将产生的对象在专程具体的实现类,就彻底失去了使用Factory模式的意义Top
9 楼jeffyan77(jeffyan77)回复于 2004-03-26 11:47:20 得分 0
大家好。我现在就讲一讲我当初设计这个例子时的考虑。
首先,简单工厂模式是对创建逻辑的封装,这个模式把创建逻辑的可能改变封装到一个地方,就是工厂方法里面。任何创建逻辑的改变,只会发生在工厂方法里面。
其次,工厂模式不能改变产品对象的结构,也不能影响到产品等级结构。如果需要改变类型特征,不能在创建过程中解决。
出于这两个考虑,我特别在书中给出了这个例子,意思就是演示给读者,产品的等级结构不一定具有完全相同的接口,只要有必要,类型转换就是必须的。
相反,如果我举的例子中,产品类具有完全相同的接口,读者就可能会误解,以为只有这样才可以使用简单工厂模式。
学习设计模式,一定要注意不要教条化。类型转换是现实生活中的一部分,子类的接口与父类不相同,这也是现实生活中的一部分。Achilles是真正的英雄,但也有一个泥作的脚后跟,如来佛无父无母千年修得金身,但也从老鹰肚子里出生了一次。
所有的Java类都是java.lang.Object的子类,如果子类接口与父类不同就不是好设计,那Java系统里就知应该有java.lang.Object类一个类了,这样Java有什么用呢?
所谓接口相同,就是一种对称性。所有的对称性都是相对于对称性的破缺而言的。所有的对称性都是破缺的。没有破缺,就没有对称。对对称性的研究都是对破缺的研究。学习Java的第一步,不就是学会如何破坏一个Java类从java.lang.Object继承来的接口吗?怕什么?
Top
10 楼visionsky(visionsky)回复于 2004-03-26 12:58:41 得分 0
非常感谢大家,
产品的等级结构不一定具有完全相同的接口,只要有必要,类型转换就是必须的.
这句话真是精髓啊
因为我在调用方法setTreeAge的时候我肯定会知道我是调用了Apple类中的方法,
所以可以做类型转化
就当他是特事特办吧
Top
11 楼bluesage(海蓝色)回复于 2004-03-26 13:07:04 得分 0
“所谓接口相同,就是一种对称性。所有的对称性都是相对于对称性的破缺而言的。所有的对称性都是破缺的。没有破缺,就没有对称。对对称性的研究都是对破缺的研究。”
大侠的话不太好董。。。Top
12 楼visionsky(visionsky)回复于 2004-03-26 13:17:36 得分 0
就是既然有接口相同就会有接口不相同的情况
对称就是相同,破缺就是不相同
事物都是有两面性的
矛盾都是成对同时出现的Top
13 楼cooldoghuang(98753210)回复于 2004-03-26 18:18:11 得分 0
我觉得各位搞的太玄了吧,只是执行期绑定的问题而已,有必要上升到哲学的高度吗?
所有的对称性都是相对于对称性的破缺而言的。所有的对称性都是破缺的。没有破缺,就没有对称。对对称性的研究都是对破缺的研究。”
-- 实话实说,这理论我是真看不懂,这和子类父类有关系吗?阎宏博士说话太理论化了,作学问不错,可是和我们这些网友说话,还是实战点吧
另:现实生活中,难道有完全相同的接口吗?Top
14 楼bluesage(海蓝色)回复于 2004-03-27 10:14:43 得分 0
呵呵。。楼上的说的好,以后各位大侠们最好能用点具体的东西,让我们这些菜鸟能容易理解Top
15 楼xieha(hot::C++::java)回复于 2004-03-31 07:06:17 得分 0
cast的问题而已Top
16 楼armorking2003(阿墨)回复于 2004-03-31 11:18:28 得分 0
有規律就會有例外
沒有殘缺,對稱就沒有意義
但規律之所以為規律,是因爲人們總是習慣於從簡單到複雜地認識這個世界Top
-
相关文章
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn
