简单工厂模式与策略模式的优缺点以及它们的区别

时间:2021-09-01 16:51:24

一、简单工厂模式

  优点:

     实现了对象创建和使用的分离;

     客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可;

     通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

    缺点:

     工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响;

     增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度;

     系统扩展困难,一旦添加新产品不得不修改工厂逻辑;

       由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,工厂类不能得到很好地扩展。
 

二、策略模式

  优点:

     策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法和行为,也可以灵活的增加新的算法和行为。

     策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码;

     策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能;

     使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。

  缺点:

     客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

三、两者的区别

  结构:

    在结构上两者很相似,都是定义基类(或接口),根据不同的情况,new出不同的实例。

  关注点:

    它们的关注点不一样,前者关注对象的创建,后者关注行为的选择。

  解决的问题:

    工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。 

    策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。

  一位网友有趣的举例:    

    工厂模式:根据你给出的目的来生产不同用途的斧子,例如要砍人,那么工厂生产砍人斧子,要伐木就生产伐木斧子。

         即根据你给出一些属性来生产不同行为的一类对象返回给你。

         关注对象创建

      策略模式:用工厂生产的斧子来做对应的事情,例如用砍人的斧子来砍人,用伐木的斧子来伐木。

         即根据你给出对应的对象来执行对应的方法。

         关注行为的选择

 

本文参考刘伟老师主编的设计模式书籍。

参考:http://www.cnblogs.com/me115/p/3790615.html

感谢他们的奉献。