首页 新闻 会员 周边 捐助

为什么工厂方法中的工厂类要和产品的层次保持水平一致

0
悬赏园豆:50 [已关闭问题] 关闭于 2014-12-19 16:38

请看下图:

问题一:为什么工厂和产品设计成平行的

问题二:工厂设计为一层行不行,设计为针对具体产品的三个工厂

其他问题:

问题三:工厂方法使得客户端独立于具体产品的实例化过程,但是客户端和工厂类又产生了依赖,虽然可以通过反射解决问题,但是具体产品也可以通过反射实例化,是否工厂方法就没必要了

问题四:从定义上理解,当客户端需要实例化一个具体的类,但又不知道具体的类只知道具体类的上级抽象类时使用工厂方法,大家在开发中是否遇到过这种情况?

问题补充:

《设计模式》书中讲到使用工厂方法的三种情况:

1,一个类不知道它所创建的对象的类时

2,一个类希望由它的子类指定创建对象时

3,当类将创建对象的职责委托给多个帮助子类的时候....

大家肯定都用过工厂方法,是不是符合这三条中的其中一条?

会长的主页 会长 | 专家六级 | 园豆:12461
提问于:2014-12-12 12:00
< >
分享
所有回答(2)
0

你的图是抽象工厂的吧,不是工厂方法的

xmj112288 | 园豆:126 (初学一级) | 2014-12-12 17:54

是工厂方法,如果是抽象工厂的话,一个具体工厂就不会只和一个产品有关联了,大部分设计模式书举例子时都是两层产品(抽象的产品和具体的产品),我画的是多层产品的例子

支持(0) 反对(0) 会长 | 园豆:12461 (专家六级) | 2014-12-12 18:05

@会长:  你看过大话这本书吗?这是大话里的图,你放的图在大话里就是抽象工厂的

支持(0) 反对(0) xmj112288 | 园豆:126 (初学一级) | 2014-12-12 18:16

@会长: 工厂方法 是一个工厂创建一个实例,在做扩展时,只需添加相应的工厂类和对应的实现类。

 和简单共产相对比: 简单工厂每次扩展都得修改 switch 方法, 不满足设计原则-开闭原则,工厂方法可是看作是对他的改善

抽象方法是最复杂的工厂,老实说我也没搞得特别清楚,所以就不用

支持(0) 反对(0) xmj112288 | 园豆:126 (初学一级) | 2014-12-12 18:19

@2727551894: 一会儿我去看《大话》里的抽象工厂图,你上的是工厂方法的图。我看《Java与模式》这本书对抽象工厂的介绍非常详细的,建议看下

支持(0) 反对(0) 会长 | 园豆:12461 (专家六级) | 2014-12-12 18:27

@2727551894: 我看了下《大话》里的抽象工厂的图,你再仔细看下,它那个图每个具体工厂都和2个产品有关联,我画的这个图之和一个产品有关联,说实话,《大话》这两张图有点太简单了,产品没有复杂的树形层次关系,无法体现出抽象工厂模式中“产品家族”的概念,《Java与模式》中对产品家族这个概念讲的相当透彻:看图:

 

支持(0) 反对(0) 会长 | 园豆:12461 (专家六级) | 2014-12-12 18:33

@2727551894: 不能贴图了,咱们看盗版书都暴露了.........

支持(0) 反对(0) 会长 | 园豆:12461 (专家六级) | 2014-12-12 18:37

@会长: 这是抽象工厂的图,你的图只是对他的简化,一个工厂只有一个商品,实际情况是一个工厂可能会有多个商品,就是大话的图了。设计模式我在项目中用的不多,主要用的还是设计原则。模式都是从原则演化过来的,所以弄熟了原则再来看模式会简单很多。而且复杂的设计模式,不建议在项目中使用,1是学习成本高。2是开发成本太高。我们老大就明确说了不让用复杂的设计模式,只用些简单的

支持(0) 反对(0) xmj112288 | 园豆:126 (初学一级) | 2014-12-12 18:44

@会长: 当然如果是学习的话,除了设计模式,推荐你看看重构方面的书,重构在我看来比设计模式要有用

支持(0) 反对(0) xmj112288 | 园豆:126 (初学一级) | 2014-12-12 18:45

@2727551894: 我其实就是想知道真相,呵呵。你发的这个图和我的图有2个区别:

  • 你发的图每个具体的工厂分别和超过一个产品有关联,而我画的图每个工厂只和一个产品相关
  • 你发的图它只话了2层,一层是抽象产品,一层是具体产品,如果产品不只两层,抽象工厂模式中工厂的层次不会随着产品的层数增加,还是两层:一层是抽象的工厂,一层是具体的工厂(所以我说它这个图太简单了有点);我画的图里工厂类型和产品类型的层次是对应的,有一层产品,就有一层工厂。工厂方法模式的一个特征是工厂和产品时平行的,而抽象工厂没有这个说法
支持(0) 反对(0) 会长 | 园豆:12461 (专家六级) | 2014-12-12 18:55

@2727551894: 多谢推荐

支持(0) 反对(0) 会长 | 园豆:12461 (专家六级) | 2014-12-12 18:58
0

对于问题三有同样疑惑。我的想法是可能在创建复杂对象时有优势,当需要用多行代码构建一个对象时,工厂方法模式可以把这个构建过程封装起来,这样可以避免大面积的重复代码。当然简单工厂模式也能做到,但是较之简单工厂模式,工厂方法模式更符合开闭原则。

ryg | 园豆:202 (菜鸟二级) | 2016-07-06 13:47

 说实话,我看不懂当初提的问题了,怪不得没人回答我。专研的深了就回发现很多问题,但是没处问,因为大部分都是浅尝辄止的,可以去英文技术网站搜搜答案。

支持(0) 反对(0) 会长 | 园豆:12461 (专家六级) | 2016-07-06 18:27

 说实话,我看不懂当初提的问题了,怪不得没人回答我。专研的深了就回发现很多问题,但是没处问,因为大部分都是浅尝辄止的,可以去英文技术网站搜搜答案。

 

至于第三个问题,我现在想想应该是这样的:工厂方法解耦的是调用者和实例化具体产品之间的耦合,当实例化具体的产品很复杂多变时可以使用此模式,因为毕竟实例化工厂是简单的,实例化产品是复杂的,客户端和工厂产生耦合总比和产品的实例化产生耦合要好。详细实例化产品的代码的编写者和调用者不是同一个人。调用者不用关心具体的产品的实例化过程而只要知道工厂即可,体验是很好的。当然,如果实例化产品很简单,感觉就吃模式就没必要了。还有就是产品太多了也不行,会类爆炸,需要根据配置文件注入依赖比较好了。

支持(0) 反对(0) 会长 | 园豆:12461 (专家六级) | 2016-07-06 18:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册