不该用Generics实现Abstract Factory的理由

最近在与Ninputer争执.NET与Java的泛型特点,他的意见是.NET的Generics要更强(实现层面与语法层面两个层面),我的意见是Java的Generics的语法层面要更强(语法层面的强主要是指易用性)。他让我看了一篇用.NET Generics实现的Abstract Factory的文章http://blog.joycode.com/ninputer/archive/2006/01/12/70313.aspx,说如果用Java就会遇到很多麻烦。因为我也是初学Java的Generics,所以比较感兴趣这个话题,看了一下文章后做了一些实现后得出了以下一些结论。

该不该使用Generics实现Abstract Factory?

我的意见是不应该,理由如下:

  1. 具体创建对象的时候,也就是在ConcreteFactory中,不是所有情况都是简单地一个new操作就算是创造对象了,就像它的名字所示那样,具体对象具体操作,这里不能泛化,一定要根据具体类型来实现对象创建。
  2. 就像许多人提到的,到底用多少个type variable才算合适呢?AbstractFactory<A, B>, AbstractFactory<A, B, C> ??? 简单地说,Abstract Factory是不能够定量的,目前.NET与Java的泛型都不能实现这点。

Java的泛型真的那么弱吗?如果要实现定量的Abstract Factory真的很难吗?

我的答案是否,实际上,我觉得用Java的语法无论在实现上的阅读与易用性都要比.NET的语法强。下面是我给出的Abstract Factory的实现,虽然我说过,用Generics实现Abstract Factory并不合适。

 

ExpandedBlockStart.gif ContractedBlock.gif interface  Processor  dot.gif {}
None.gif
ExpandedBlockStart.gifContractedBlock.gif
interface  Ram  dot.gif {}
None.gif
ExpandedBlockStart.gifContractedBlock.gif
class  PentiumProcessor  implements  Processor  dot.gif {}
None.gif
ExpandedBlockStart.gifContractedBlock.gif
class  DDRRam  implements  Ram  dot.gif {}
None.gif
ExpandedBlockStart.gifContractedBlock.gif
interface  AbstractFactory < PA, PB >   dot.gif {
InBlock.gif   PA createA();
InBlock.gif   PB createB();
ExpandedBlockEnd.gif}

None.gif
ExpandedBlockStart.gifContractedBlock.gif
class  IntelFactory  implements  AbstractFactory < PentiumProcessor, DDRRam >   dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif   
public PentiumProcessor createA() dot.gif{
InBlock.gif      
// 一切特化且可在这里实现。
InBlock.gif
      return new PentiumProcessor();
ExpandedSubBlockEnd.gif   }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif   
public DDRRam createB() dot.gif{
InBlock.gif      
// 一切特化且可在这里实现。
InBlock.gif
      return new DDRRam();
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}

None.gif
None.gif
//  使用
None.gif
AbstractFactory <?   extends  Processor,  ?   extends  Ram >  factory  =
None.gif   
new  IntelFactory();
None.gif      
None.gifProcessor processor 
=  factory.createA();
None.gifRam ram 
=  factory.createB();

以上代码并没有运用不必要的TypeToken,而且也没有实例化时特化的问题,但是仍然没有解决Abstract Factory的量的问题。可以看出,这段代码非常的简洁,我觉得这段代码真正突出了Generics的优点:泛化类型,而没有做不应该做的过多的事情(比如泛化本来应该是特化的东西)。

注意Java的Generics语法是可以使用wildcard的(?),这是.NET所没有的。wildcard的特点之一就是能够在变量声明中使用,这是很重要的一大特色。

转载于:https://www.cnblogs.com/cavingdeep/archive/2006/03/24/357434.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值