谢谢你们,
抽象出来的东西本意是不变的,只要它变了,就等于我们什么也没有做。
题外话:
我最早还想过语言什么时候能出一个向上定义的关键字,即基类可以感知派生类在做什么,并不只是控制和限制派生类。
@T.t.T!Ck. 你好
petshop的返回值是具体的类,也就是说它不得不做很多方法,在这里的返回值是object,区别很大。
6-13行名字写错了,不好意思。
应为接口的实现 :
6 public ProductFactory : IFactory
7 {
8 object Create(string className)
9 {
10 string path = "程序集";
11 return Assembly.Load(path).CreateInstance(path + "." + className);
12 }
13 }
32行也同样要改:
CreateProduct->Create
建议在原文中把所有错误都修正.
我的理解是抽象工厂模式的通过建立不同的工厂类来隐藏是创建不同产品系列的时候的不同的实现。所以抽象工厂模式的前提是不同系列产品的构建方式是不同的。
后面的改造方法则似乎在说ProductFactory1和ProductFactory2所隐藏的创建逻辑实际上是相同的。这样ProductFactory类其实已经退化为一个工厂方法。如果是这个意思,那么这里继承IFactory也不是必需的吧。
还有就是看到现在的示例代码中已经把不同产品线产品的创建逻辑简化到反射创建对象这种语言特性上,我猜想这里作者是不是在调整的时候把原来一部分对象创建的那部分有差异的逻辑移到了产品类的代码之中了,如果是这样可能要考虑产品类的职责定义修改以及封装可能被破坏的问题。
完全同意 Ying-Shen 的观点。
楼主的这个改造后的抽象工厂模式事实上已经不是真正意义上的抽象工厂模式了,而可以被认为是参数化的工厂方法模式,IFactory已经没有必要存在了。
另外,楼主在对 T.t.T!ck 的回复中说“在这里的返回值是object,区别很大”,个人认为这个解释是不合理的,抽象工厂方法解决的是创建不同级别的分系列的产品的创建问题,如果返回值都是object,则失去了原有的意义了。
但在.Net体系中,楼主还是可以使用这种方法来创建对象的。
关于抽象工厂模式,请参考吕震宇的文章
http://www.cnblogs.com/zhenyulu/articles/36885.html,另外建议参考他的设计模式系列
http://www.cnblogs.com/zhenyulu/category/6930.html?Show=All。
@Ying-Shen,您好
是的,我只是拿了抽象工厂做个例子来改造一下,从而达到说明问题,以后有机会我还会把这个问题从各个方面全部叙述一下(性能 封装性等方面)