论坛首页 Java企业应用论坛

工厂方法模式应该是这样的

浏览 17779 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-08-23  
楼主的工厂都生产自己去了?应该有一个抽象的Product返回才对吧。

public abstract Product create();


抽象的Factory的子类一般都不放主要的业务代码,test(int)和test2(String)应该都是Product的方法而不是放在A也就是Factory的里面

A a = new A1();
Product p = a.create();
p.test(1);
p.test2("soft");


按楼主的观点上面第一行毫无必要,但是如果

public void doSth(A param) {
    A a = param;
    Product p = a.create();
    p.test(1);
    p.test2("soft");
}


用工厂就有优势了,用A1,A2,A3来调用甚至将来再增加A4,A5都没问题,只要他们的产品都继承Product都有test和test2就可以了

除非还有其他的类牵涉进来,要不Product里面的test和test2就没有必要再加多一层Facade吧,如有必要顶多再加一个方法重构一下。
0 请登录后投票
   发表时间:2011-08-23  
至于你的设计中用了什么哪些模式,那根本就不重要.....
0 请登录后投票
   发表时间:2011-08-23  
没听懂,在关键思想转折的地方一踏糊涂!
0 请登录后投票
   发表时间:2011-08-23  
木有看懂
0 请登录后投票
   发表时间:2011-08-23  
还真没有看懂。。
0 请登录后投票
   发表时间:2011-08-23  
1 首先我觉得你在这两个模式的叫法上让人容易产生歧义,你说的简单工厂应该是“工厂方法”,而你说的工厂方法应该是“抽象工厂”。
2 用外观模式实现选择有点别扭,概念上外观模式是为了操作各个子系统的。
3 抽象工厂对具体部件的选择是封装了的,只是对具体工厂的选择没有封装,你可以自己封装,比如加一层工厂方法,工厂方法内用Map封装选择。
0 请登录后投票
   发表时间:2011-08-23  
我也表示没看懂。
0 请登录后投票
   发表时间:2011-08-23  
kingdu_12 写道
我觉得楼主钻研的太细了。
工厂方法,外观模式从目的上来说,是完全不同的,没有必要放在一起讨论。

设计模式中,功能相近或者结构相似的模式有很多,不用像答题一样,花费大量时间,把各个细微之处都抠得这么仔细。


同意红色字体部分。

不同的设计模式最重要的是表达不同的意图。

工厂模式的意图在于将创建对象的逻辑封装起来,
外观模式的意图在于提供一个便利的API,

你可以根据自己的意图选择是XXXFactory或XXXFacade。

不能从结构上划分不同模式的原因在于:
所有的设计模式所使用的都是面向对象所涉及的基本概念:接口、抽象类、具体类,这些概念之间的关系:依赖、关联、组合、复合、继承(接口继承、接口实现、类继承(抽象类继承、具体类继承)),
结构上差别比较大的模式之间一般不容易混淆,如:Singleton模式与Template Method。
但是结构上相似的模式就容易发生混淆,如:Adapter(对象适配器)、Proxy、Decorator ,
这三者的选择标准如果表达从一个接口转换到另一个接口则使用Adapter,如果是需要对目标对象进行控制则使用Proxy,
如果是需要对目标对象的功能进行增强则使用Decorator,

还有一些意图、结构相似的模式也需要好好把握:
Simple Factory、Common Factory、Abstract Factory;
Singleton、Prototype;
Template Method、Strategy;
Strategy、State;
Iterator、Visitor。
0 请登录后投票
   发表时间:2011-08-23  
后面一部分没看懂
0 请登录后投票
   发表时间:2011-08-23  
madiot 写道
楼主的工厂都生产自己去了?应该有一个抽象的Product返回才对吧。

public abstract Product create();


抽象的Factory的子类一般都不放主要的业务代码,test(int)和test2(String)应该都是Product的方法而不是放在A也就是Factory的里面

A a = new A1();
Product p = a.create();
p.test(1);
p.test2("soft");


按楼主的观点上面第一行毫无必要,但是如果

public void doSth(A param) {
    A a = param;
    Product p = a.create();
    p.test(1);
    p.test2("soft");
}


用工厂就有优势了,用A1,A2,A3来调用甚至将来再增加A4,A5都没问题,只要他们的产品都继承Product都有test和test2就可以了

除非还有其他的类牵涉进来,要不Product里面的test和test2就没有必要再加多一层Facade吧,如有必要顶多再加一个方法重构一下。


我很赞同你的说法, 其实在这里如果和反射结合起来或者IOC结合才是工厂方法的用武之地。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics