看了Head-First工厂模式那一章,完全蒙了,发现工厂模式和策略模式好像,傻傻地分不出来什么他们的区别,上网找各种资料,然后反复看了一下Head First设计模式这本书,现在我来做一些我个人的总结吧,引用一些在网上看到的好的解释。
首先,定义:
策略模式:定义了算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
工厂模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
策略模式是行为的封装,工厂模式是对象的创建。
一个形象的例子:
工厂模式:根据你给出的目的来生产不同用途的斧子,例如要砍人,那么工厂生产砍人斧子,要伐木就生产伐木斧子。
即根据你给出一些属性来生产不同行为的一类对象返回给你。
关注对象创建
策略模式:用工厂生产的斧子来做对应的事情,例如用砍人的斧子来砍人,用伐木的斧子来伐木。
即根据你给出对应的对象来执行对应的方法。
关注行为的选择
在书中,讲策略模式用了Duck拥有多种行为,比如飞这个行为来说,会飞,不会飞,飞的快,飞得慢等不同的行为。所以定义飞的行为,然后对这个行为不同的实现,在实现鸭子的时候,每个鸭子使用什么飞的行为就直接使用对应的飞的类就好了。(行为对于你是白盒,你需要知道有哪些飞的行为,这样你才可以使用这些行为)
工厂模式对应的是不同风格的pizza,比如纽约风格的披萨,芝加哥风格的披萨。假如你喜欢纽约风格的披萨,当你看到菜单的时候,你发现有纽约风格的披萨,你只需要点纽约风格的披萨就行了,你不用关心披萨怎么制作的,反正他就是从纽约工厂制作的披萨就行了。(生产对于你是黑盒,不用关心,你只要具体的披萨就行了)
所以在下面的情况下应当考虑使用策略模式:
1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2. 一个系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些具体算法类都是一个抽象算法类的子类。换言之,这些具体算法类均有统一的接口,由于多态性原则,客户端可以选择使用任何一个具体算法类,并只持有一个数据类型是抽象算法类的对象。
3. 一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的复杂的和只与算法有关的数据。
4. 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。此时,使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象设计的概念。
工厂模式:
1.构造对象同时还需要对对象进行初始化,如果都放在构造函数里由new操作符调用,可能导致构造函数很长。这种将很多工作都放在构造函数中的做法相当危险,因此需要一个专门生产对象,并适当初始化的工厂。
2.项目中可能会有很多继承于相同class的子类,每一个子类实例化都用new将是一件费力的事,不如将这些重复的工作交给类工厂。
3.有时候,我们不需要多个对象事例(只需要一个),通常用new操作无法完成。
————Rocky