论坛首页 Java企业应用论坛

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

浏览 17753 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-08-29  
kingdu_12 写道
我觉得楼主钻研的太细了。
工厂方法,外观模式从目的上来说,是完全不同的,没有必要放在一起讨论。

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


不好意思,估计我就是按着自己脑子里面的想法写的这个帖子,没有讲的太清楚,不容易理解吧。
其实我本意不是为了矫正工厂方法模式应该是什么模式而不是什么模式的。因为外观模式我比较的认同,这个模式是封装重构代码的时候很容易想起来的一种方式,不管你之前接触过oop没有。我认为的模式应该是自自而然的东西,而不该是把因为有这个模式,大家用过的都说好,所以应该去使用它。而是你能用最简单的理由说服自己去使用它。
0 请登录后投票
   发表时间:2011-08-30  
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吧,如有必要顶多再加一个方法重构一下。


我觉得简单工厂模式是好理解的,作用应该是选择逻辑的封装,如是在理解工厂方法的时候也觉得这个模式是用来封装选择逻辑的,这么理解让我理解工厂方法模式走了不少弯路,所以提议用外观模式的思路,用最基本的封装的思路去理解工厂方法模式很更容易些。
public void doSth(A param) {
    A a = param;
    Product p = a.create();
    p.test(1);
    p.test2("soft");
}

比如上面这段代码,其实在调用doSth 的时候还是涉及到要客户端去选择A的实例的,跟直接new 一个A的实例是没有区别的,A1,A2,A3,A4,A5 有需要new出来就行了。所以我讲工厂方法不存在对选择的封装。  更像是对方法的抽象,就像模板模式里面的一样,只是这个方法返回的是一个真正用来处理业务的javabean对象而已。
0 请登录后投票
   发表时间:2011-09-02  
忐忑中.......
  个人感觉 “工厂模式” 就是要把复杂的操作变的简单化 可楼主 你这段代码说的意思 俺没看懂! 简而细
0 请登录后投票
   发表时间:2011-10-09  
一个接口A, 实现类有A1,A2,A3
A a = new A1();
和通过工厂方法获得如
public A getAFactory(int type)
{
   if(type ==1)
    {
        a = new Al();
    }
}
表面上看起来时差不多,如果通过配置文件动态改变,则通过工厂方法就有优势。
如A1代表jdbc中oracle数据库的操作类
  A2代表jdbc中mysql数据库的操作类
  A3代表jdbc中sqlserver的数据库操作类。
通过配置文件,可以在不修改原代码的基础上动态改变程序中对数据库操作类的切换。
0 请登录后投票
   发表时间:2012-01-11   最后修改:2012-01-11
我搞不懂工厂方法到底应该用在哪里?有什么好处?
就像LZ说的,说到开闭原则,简单地写    A a=new A1();  就已经满足了。
“使一个类的实例化延迟到其子类”,A a = new A1();的写法算不算A的实例化延迟到子类A1呢?如果算,那为什么又要在工厂方法里说这句话呢?不用工厂方法都达到这个目的了,为什么要用工厂方法呢?
《研磨设计模式》里说,厂方法模式和IoC/DI思想类似,在子工厂里创建产品,调用子工厂对象的对应方法,把产品对象反向注入到父工厂里去。这个我更糊涂了。调用子工厂得对应方法的时候,不就new了A1()产品对象吗?我们做了这么多事情,凭空增加了父工厂和子工厂,然后让凭空多出来的父工厂享受反向注入的好处吗?那关原来的A和A1产品什么事啊?
其实我发现很多书里讲工厂模式,都不太一样,网上的文章又是直接Ctrl+c/v,看来看去就更糊涂了。有没有人真正在自己做过的项目里用到了工厂方法模式?谁能说一下吗?
LZ讲的使用工厂方法的目的,倒是和《研磨》里说的一样,但是为什么其他书里完全没提到这一点呢?
0 请登录后投票
   发表时间:2012-01-11   最后修改:2012-01-11
huangxuan2046 写道
  
所以很多设计模式在讲到
工厂方法模式的时候会说 里面的create方法最好不给外面调用的。因为其实客户端不是需要对象
A,是需要完成特定的功能,这里是face方法(他才是客户端真正需要的),只是这些功能实现又依赖A罢了。
工厂模式跟简单工厂设计理念是不同的,他没有将选择的逻辑封装,而更像是个外观模式的变体。
其实像下面的这种需求,根本就不需要使用工厂方法模式的:
A a=new A1();
a.test();// 客户端就只调这么一个方法,没有其他更复杂的逻辑了
//如果手不jian实在不需要在搞个工厂方法模式出来。



大家觉得如何?

我倒是想赞同LZ的观点,但为什么其他书和文章都没谈到这一点呢?大家举的例子,都是只调用一个方法a.test()而已的。如果你不同意LZ,那能否说明一下到底什么样的情况才用工厂方法?我真的已经晕了。
比如《深入浅出设计模式》一书中,就是为了得到不同的具体对象A1,A2,而根本没去用到A的某个方法。那么,难道是《深》错了吗?
0 请登录后投票
   发表时间:2012-02-07  
读配置文件,反射,才是真正的简单工厂模式,if判断的 全部可以否决,增加个新类就要改代码的也要否决
0 请登录后投票
   发表时间:2012-02-07  
工厂模式不是你说的这样的!!!
0 请登录后投票
   发表时间:2012-02-22  
简单地说、工厂方法不就是具体工厂生产具体产品吗
0 请登录后投票
论坛首页 Java企业应用版

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