策略模式vs工厂模式的区别

定义:

工厂模式的思想主要为:多个类似的子类继承同一个父类,对其父类中的变量进行操作;工厂类负责判断、控制哪个子类被执行,而工厂类调用子类完成后,返回的结果是该子类的父类,该父类中的变量已经被操作过了,访问该父类,得到我们想要的结果

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。

策略模式让算法独立于使用它的客户而独立变化。

在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。


1. 相似:

    在模式结构上,两者很相似;

2.差别:

  • 用途不一样 

  • 工厂是创建型模式,它的作用就是创建对象; 

  • 策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;
  • 关注点不一样 


  • 一个关注对象创建 


  • 一个关注行为的封装

  • 解决不同的问题 


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

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

  • 工厂相当于黑盒子,策略相当于白盒子;



工厂模式:有一天你决定去吃KFC,一看菜单,哦,种类很多呀,你就点了个老北京,过了二十分钟,你的老北京就来了就可以吃到了。但这个老北京是怎么做的,到底面粉放了多少,鸡肉放了多少,佐料放了多少,有多少到工序,你是不需要管的,你需要的是一个美味老北京

所以上面的老北京是创建型模式,有了工厂,有了具体的抽象方法。只要继承相应的流程。


策略模式:同样还是在KFC,你要一个老北京,老板说想吃自己去做吧。原料有鸡肉、面粉、佐料。工序有123工序,你自己去做吧。然后你就需要自己按照策略去做,到底放多少培根,放多少面粉,放多少佐料,这都你自己来决定,工序123,你是怎么实现的,都你自己决定。最后你得到了老北京

另外一个例子,出行旅游的策略。


所以上面的老北京是行为型模式,不同的策略,不同的要求,有不同的算法。


  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
策略模式和工厂方法模式都是常用的软件设计模式。其中,策略模式是一种行为型模式,它定义了一系列算法,并将每个算法封装起来,使得它们可以相互替换。而工厂方法模式是一种创建型模式,它定义了一个用于创建对象的接口,让子类决定实例化哪一个类。两者的区别主要在于它们的用途和解决的问题不同。 策略模式旨在解决如何在运行时根据需要选择算法的问题。它允许用户定义一系列算法,并将它们封装在独立的类中,从而使得它们可以相互替换。这样,用户就可以在运行时根据需要选择算法,无需修改原有代码。策略模式适用于需要在运行时根据不同情况选择不同算法的场景。 工厂方法模式旨在解决如何通过类来创建对象的问题。它定义了一个用于创建对象的接口,让子类来决定实例化哪一个类。这样,用户就可以在运行时动态创建对象,而无需知道实际创建的类是哪一个。工厂方法模式适用于需要动态创建对象的场景。 因此,策略模式和工厂方法模式的区别在于它们解决的问题不同。策略模式解决算法的选择问题,而工厂方法模式解决对象的创建问题。 <<参考文献>>: Design Patterns: Elements of Reusable Object-Oriented Software. Gamma, E. et al., 1994, p315. https://en.wikipedia.org/wiki/Strategy_pattern https://en.wikipedia.org/wiki/Factory_method_pattern
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值