锁定老帖子 主题:工厂方法模式应该是这样的
精华帖 (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吧,如有必要顶多再加一个方法重构一下。 |
|
返回顶楼 | |
发表时间:2011-08-23
至于你的设计中用了什么哪些模式,那根本就不重要.....
|
|
返回顶楼 | |
发表时间:2011-08-23
没听懂,在关键思想转折的地方一踏糊涂!
|
|
返回顶楼 | |
发表时间:2011-08-23
木有看懂
|
|
返回顶楼 | |
发表时间:2011-08-23
还真没有看懂。。
|
|
返回顶楼 | |
发表时间:2011-08-23
1 首先我觉得你在这两个模式的叫法上让人容易产生歧义,你说的简单工厂应该是“工厂方法”,而你说的工厂方法应该是“抽象工厂”。
2 用外观模式实现选择有点别扭,概念上外观模式是为了操作各个子系统的。 3 抽象工厂对具体部件的选择是封装了的,只是对具体工厂的选择没有封装,你可以自己封装,比如加一层工厂方法,工厂方法内用Map封装选择。 |
|
返回顶楼 | |
发表时间:2011-08-23
我也表示没看懂。
|
|
返回顶楼 | |
发表时间: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。 |
|
返回顶楼 | |
发表时间:2011-08-23
后面一部分没看懂
|
|
返回顶楼 | |
发表时间: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结合才是工厂方法的用武之地。 |
|
返回顶楼 | |