tempad
Readygo技术搜索引擎 >>游戏开发 >> 有一个用简单工厂模式遇到的问题,很急啊

有一个用简单工厂模式遇到的问题,很急啊

Readygo技术搜索引擎 网络搜索 efish 2008-1-17 2:00:56

有一个用简单工厂模式遇到的问题,很急啊

楼主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

责任编辑: efish 参与评论 查找更多:
相关文章
怎样配置PhpMyAdmin?激活使用链接表的额外特性? 怎样配置PhpMyAdmin?激活使用链接表的额外特性?
如何用isqlw.exe,,,执行xxx.sql 文件(条件winnt… 如何用isqlw.exe,,,执行xxx.sql 文件(条件winnt在dos下。。。。。)
使用WEB HTML编辑器时,如何让插入的图片,居中,左… 使用WEB HTML编辑器时,如何让插入的图片,居中,左对齐,右对齐,
请您,帮我改一下!!! 请您,帮我改一下!!!
有关静态类的问题(谢谢)急! 有关静态类的问题(谢谢)急!
如何使飘动图片可以跑到IE以外的范围? 如何使飘动图片可以跑到IE以外的范围?
这个文件怎么用? 这个文件怎么用?
非买不行吗?<<Microsoft SQL Server 2000技术… 非买不行吗?<<Microsoft SQL Server 2000技术内幕>>
这个存储过程怎么写。 这个存储过程怎么写。
dbgrideh的问题请高手们来帮我解决这个问题,很急手。 dbgrideh的问题请高手们来帮我解决这个问题,很急手。
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn

分类导航
Readygo技术搜索引擎