请看下图:
问题一:为什么工厂和产品设计成平行的
问题二:工厂设计为一层行不行,设计为针对具体产品的三个工厂
其他问题:
问题三:工厂方法使得客户端独立于具体产品的实例化过程,但是客户端和工厂类又产生了依赖,虽然可以通过反射解决问题,但是具体产品也可以通过反射实例化,是否工厂方法就没必要了
问题四:从定义上理解,当客户端需要实例化一个具体的类,但又不知道具体的类只知道具体类的上级抽象类时使用工厂方法,大家在开发中是否遇到过这种情况?
《设计模式》书中讲到使用工厂方法的三种情况:
1,一个类不知道它所创建的对象的类时
2,一个类希望由它的子类指定创建对象时
3,当类将创建对象的职责委托给多个帮助子类的时候....
大家肯定都用过工厂方法,是不是符合这三条中的其中一条?
你的图是抽象工厂的吧,不是工厂方法的
是工厂方法,如果是抽象工厂的话,一个具体工厂就不会只和一个产品有关联了,大部分设计模式书举例子时都是两层产品(抽象的产品和具体的产品),我画的是多层产品的例子
@会长: 你看过大话这本书吗?这是大话里的图,你放的图在大话里就是抽象工厂的
@会长: 工厂方法 是一个工厂创建一个实例,在做扩展时,只需添加相应的工厂类和对应的实现类。
和简单共产相对比: 简单工厂每次扩展都得修改 switch 方法, 不满足设计原则-开闭原则,工厂方法可是看作是对他的改善
抽象方法是最复杂的工厂,老实说我也没搞得特别清楚,所以就不用
@2727551894: 一会儿我去看《大话》里的抽象工厂图,你上的是工厂方法的图。我看《Java与模式》这本书对抽象工厂的介绍非常详细的,建议看下
@2727551894: 我看了下《大话》里的抽象工厂的图,你再仔细看下,它那个图每个具体工厂都和2个产品有关联,我画的这个图之和一个产品有关联,说实话,《大话》这两张图有点太简单了,产品没有复杂的树形层次关系,无法体现出抽象工厂模式中“产品家族”的概念,《Java与模式》中对产品家族这个概念讲的相当透彻:看图:
@2727551894: 不能贴图了,咱们看盗版书都暴露了.........
@会长: 这是抽象工厂的图,你的图只是对他的简化,一个工厂只有一个商品,实际情况是一个工厂可能会有多个商品,就是大话的图了。设计模式我在项目中用的不多,主要用的还是设计原则。模式都是从原则演化过来的,所以弄熟了原则再来看模式会简单很多。而且复杂的设计模式,不建议在项目中使用,1是学习成本高。2是开发成本太高。我们老大就明确说了不让用复杂的设计模式,只用些简单的
@会长: 当然如果是学习的话,除了设计模式,推荐你看看重构方面的书,重构在我看来比设计模式要有用
@2727551894: 我其实就是想知道真相,呵呵。你发的这个图和我的图有2个区别:
@2727551894: 多谢推荐
对于问题三有同样疑惑。我的想法是可能在创建复杂对象时有优势,当需要用多行代码构建一个对象时,工厂方法模式可以把这个构建过程封装起来,这样可以避免大面积的重复代码。当然简单工厂模式也能做到,但是较之简单工厂模式,工厂方法模式更符合开闭原则。
说实话,我看不懂当初提的问题了,怪不得没人回答我。专研的深了就回发现很多问题,但是没处问,因为大部分都是浅尝辄止的,可以去英文技术网站搜搜答案。
说实话,我看不懂当初提的问题了,怪不得没人回答我。专研的深了就回发现很多问题,但是没处问,因为大部分都是浅尝辄止的,可以去英文技术网站搜搜答案。
至于第三个问题,我现在想想应该是这样的:工厂方法解耦的是调用者和实例化具体产品之间的耦合,当实例化具体的产品很复杂多变时可以使用此模式,因为毕竟实例化工厂是简单的,实例化产品是复杂的,客户端和工厂产生耦合总比和产品的实例化产生耦合要好。详细实例化产品的代码的编写者和调用者不是同一个人。调用者不用关心具体的产品的实例化过程而只要知道工厂即可,体验是很好的。当然,如果实例化产品很简单,感觉就吃模式就没必要了。还有就是产品太多了也不行,会类爆炸,需要根据配置文件注入依赖比较好了。