回复关系:

作者 内容
 fourfire29   factory method pattern与abstract factory pattern有何区别?

 02/05/22 13:25 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 风雪漫天   高手忙着,小弟来说一下

首先,抽象工厂和模板方法所属类别不同,抽象工厂是创建型模式,而模板方法是行为型模式。
创建型模式是用于创建对象使用的,抽象工厂的目的是为一系列产品定义创建规格,至于对象的创建,是在子类中完成的。而子类中需完成,整个产品的创建。这样,使用者无需关系其是怎么生产出来的,只需调用接口生产产品就可以了,通过替换工厂,就可以创建不同系列的产品。
行为模式主要是用来改进算法或者通信机制的,这里的模板方法就是用来改善算法,他是定义算法的骨架,而将算法的具体部分放到子类中完成,子类中完成的是算法的某些片断。这样的效果是抽象出了算法的骨架。子类只需关心某些特定的步骤该如何处理,另外,也避免了不同的子类中的代码重复。

第二点,抽象工厂是对象模式,而模板方法是类模式。这导致两个模式起作用的时机不同。对于抽象工厂,产品的创建可以延迟到运行的时候实现,而模板方法,你不需在编程的时候就实现,要么是A算法,要么是B算法,也就是必须在编译的时候就确定下来。

二者的相识之处在于,都是使用了OO的多态属性,将具体的动作延迟到子类中完成。除了这点,再无相似之处了。而多态性是真个设计模式的基础,所以如果单单从这看,你会发觉很多模式都很相似。所以我们关注模式一定要关注其上下文和目的。

其实对于模板方法,现在使用很多,如Borland的VCL或者MS的MFC中的事件处理机制,如OnCreate(),那就是一种模板方法,处理的骨架已经在框架中固定了,你重载的只是该处理中的一些片断。

照本宣科说了几句,有些我自己也没弄清楚,希望能给你一些启发。
 02/05/22 16:40 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 netwiser   不错,有个小小的打字错误

第二点,抽象工厂是对象模式,而模板方法是类模式。这导致两个模式起作用的时机不同。对于抽象工厂,产品的创建可以延迟到运行的时候实现,而模板方法,你不需在编程的时候就实现,要么是A算法,要么是B算法,也就是必须在编译的时候就确定下来。

应该改为必须。
 02/05/22 18:34 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 sealw  这样说比较简单一些:

factory method就是一个method,比如说:
Iterator it = theSampleList.iterator();
它只生产一种产品,而产品的消费者不知道它是怎样制造出来的,也不关心这一点,只关心制造出的产品的特性。其中隐含的一层含义就是,这种产品会有不同的造法,而消费者请不必关心生产者是怎样制造出来的。

abstract factory是一个factory,绝大多数情况下,它生产多种产品。产品的消费者既不关心工厂是如何制造产品的,也不关心这个工厂具体是怎么回事。其中隐含的一层含义就是,这种工厂本身有不同的造法(实现方式)。
一时想不起一个典型的例子,其实象awt就可以想象成为一个大的抽象工厂。在不同的操作系统平台上,awt使用的是不同的工厂来为消费者服务的。而消费者(GUI应用程序)不关心awt使用的是哪个工厂,也不关心那个工厂是怎样生产产品的,只关心生产出来哪些产品,这些产品的特性是什么。

这样解释不知道您清不清楚?
 02/05/22 18:36 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 sealw  人家问了模板方法了吗?

 02/05/22 22:35 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 风雪漫天   晕,搞错了,看成Template Methord了。呵呵

 02/05/23 12:34 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 fourfire29   多谢各位,小弟明白了!请看是否是这样

abstract factory是一个类,它有方法来生成不同的对象(可能是多个方法).
factory method是一个method,它的根据 parameter生成不同的对象(当然父类是相同的,或同一接口).
abstract factory可能包含factory method
 02/05/24 13:43 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 sealw  嗯,基本上有点理解了,但是注意抽象工厂就是抽象的,就是说可能会有好几种具体实现。

 02/05/24 13:47 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 fourfire29   明白了!thanks

 02/05/24 13:50 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 sealw  明白就好,至少我有点成就感,呵呵

 02/05/24 13:52 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 killcamel  回复: 多谢各位,小弟明白了!请看是否是这样

abstract factory是一个类,它有方法来生成不同的对象(可能是多个方法).
------------
yes


factory method是一个method,它的根据 parameter生成不同的对象(当然父类是相同的,或同一接口).
--------------------------------
usually 根据 parameter => 根据 class


abstract factory可能包含factory method
---------------------------
usually,abstract factory is created by factory method
 02/05/24 13:55 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 fourfire29   method parameter question

factory method的参数是包\类名称,一般用loadclass方法是吗?
有无其他方法?
 02/05/24 13:58 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 sealw  建议你去研究一下Java Swing UI Look&Feel那部分的源码。

 02/05/24 14:01 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价: