在现实开发中,遇到中途改需求,加功能的事情屡见不鲜.但面对已完成的程序代码,却是需要几乎重头来过的尴尬,这实在是痛苦不堪。说白了,原因就是因为我们原先所写的程序,不容易维护,灵活性差,不容易扩展,更谈不上复用,因此面对需求变化,加班加点,对程序动大手术的那种无奈也就成了非常正常的事了。所以在开发中要运用面向对象的分析设计编程思想,开始考虑通过封装、继承、多态把程序的耦合度降低,不把程序所有逻辑写在一起,尽量业务逻辑分离开,避免改动一小点东西,需要造成大量代码重新编译。这就需要使用设计模式使得程序更加的灵活,容易修改,并且易于复用。

  • 简单工厂模式--创建型模式


  1. 定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类
  2. 在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method)
  3. 需要什么,只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道其实现过程
  4. 例如,计算器(加减乘除)运算,加减乘除则被称为参数,工厂可以根据参数的不同返回不同的算法,这就是简单工厂模式
  • 简单工厂模式的优缺点和适用环境  

  • 简单工厂模式的优点

    (1)工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责
    (2)客户端无需知道所创建具体产品的类名,只需知道参数即可
    (3)也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。

  • 简单工厂模式的缺点

    (1)工厂类集中了所有产品的创建逻辑,职责过重,一旦异常,整个系统将受影响
    (2)使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
    (3)系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
    (4)简单工厂模式使用了static工厂方法,造成工厂角色无法形成基于继承的等级结构。

  • 简单工厂模式的适用环境

    (1)工厂类负责创建对的对象比较少,因为不会造成工厂方法中的业务逻辑过于复杂

    (2)客户端只知道传入工厂类的参数,对如何创建对象不关心

使用简单工厂模式,可以避免每次新增或修改一种算法的时候需要去变更原有的代码,而我们仅仅只用确定如何去实例化对象,例如输入运算符号,工厂就能实例化出对应的算法对象,通过多态就能实现计算方式。

注:每新增一种算法需要在工厂类方法中增加相应的语句,例如用switch来判断时候,就需要增加一个分支,返回新增的实例对象。

Strategy 策略模式——对象行为模式

1.定义:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立使用它的客户而变化。

2.适用性:许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

总结简单工厂模式和策略模式
1.从类型上说:简单工厂模式属于创建型模式,而策略模式属于行为型模式。
2.接下来,看一个小例子:

 斧子有很多种,有一个工厂专门负责生产各种需求的斧子。

工厂模式:
1)根据你给出的目的来生产不同用途的斧子,例如要砍人,那么工厂生产砍人斧子,要伐木就生产伐木斧子。
2)即根据你给出一些属性来生产不同行为的一类对象返回给你。
3)关注对象创建
策略模式:
1)用工厂生产的斧子来做对应的事情,例如用砍人的斧子来砍人,用伐木的斧子来伐木。
2)即根据你给出对应的对象来执行对应的方法。
3)关注行为的选择
3.简单工厂模式:根据客户选择的条件,来帮客户创建一个对象。
 策略模式:客户给它一个创建好的对象,它来帮客户做相应的事

通过比较客户端的代码发现:
  简单工厂模式:将对象的选择创建交给了简单工厂类,客户端只需要输入相应的条件就可以,不用负责对象的创建,但是需要客户端自己调用算法类的方法。但是一旦需要增加新的运算类,比如开根运算,就要去修改简单工厂类。
  策略模式:对象的选择创建仍需要自己来做,但是将调用方法的职责交给了Context类。一旦需要增加新的策略需要修改客户端。

因此,简单工厂模式的缺点就是当有新的需求增加时,需要频繁的修改工厂类。只用策略模式,当有新的需求增加时需要修改的是客户端,客户端仍然承担着创建对象的职责,并没有减轻客户端的压力。而将这两种模式结合起来使用,则需要修改 Context 类,总之不是完美的。

简单工厂模式与策略模式相关推荐

  1. android工厂模式和策略模式,android 源码设计模式读书笔记(四)工厂模式和策略模式...

    把这两个一起写 因为他们两个UML的代码接口非常的相似 工厂模式代码结构图 image.png 策略模式UML image.png 在我们看完结构图后 感觉位移不同的就是Factory个Context ...

  2. 设计模式(1)--简单工厂模式、策略模式

    设计模式(1)--简单工厂模式.策略模式 1. 简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static ...

  3. 工厂模式与策略模式之区别

    设计模式有很多种,其中功能相似的很多,但是为什么还要分这么多种名字,查阅资料,我觉得下面的解释最为合理:用途不一样,名字就有区别,一把斧头用来砍人就叫凶器,用来砍柴就叫伐木斧,用来劈门就叫消防斧,这些 ...

  4. 【设计模式2_工厂模式、策略模式】

    工厂模式 工厂模式与策略模式通常可以配合使用,成对出现,也是初学设计模式时常常分不清二者区别的原因. 简单工厂 业务场景需要根据传入的不同参数以获取对应的对象来处理各自的逻辑,很容易写出如下代码: v ...

  5. 设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用

    一.工厂模式(Factory pattern) 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是 ...

  6. Java设计模式(方法工厂类、单例模式、代理模式、策略模式、适配器、观察者、装饰类等)

    目录 一.简单工厂模式(Factory Method) 二.工厂方法模式 三.抽象工厂模式(Abstract Factory) 3.1 三个工厂模式区别: 四.单例模式(Singleton) 1.饿汉 ...

  7. 拿捏大厂面试,设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用

    一.工厂模式 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是Java 中比较常见的一种设计模式 ...

  8. 工厂模式和策略模式的综合使用

    目录 一.简单的工厂模式了解与使用 (一)基本概念理解 (二)简单工厂模式的认识和对应角色的分析 基本认识 角色理解 (三)使用场景和典型应用 二.简单的策略模式了解与使用 (一)基本概念理解 (二) ...

  9. 策略模式和工厂模式的区别_java设计模式之状态模式,策略模式孪生兄弟

    状态模式 状态模式(State Pattern)中,类的行为是基于它的状态改变的,状态之间的切换,在状态A执行完毕后自己控制状态指向状态B,状态模式是不停的切换状态执行.这种类型的设计模式属于行为型模 ...

  10. 策略模式、策略模式与Spring的碰撞

    策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式. 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A地-B地往返都 ...

最新文章

  1. 程序员拯救乐坛?OpenAI用“逆天”GPT2.0搞了个AI音乐生成器
  2. 数据结构-王道-树和二叉树
  3. .Net开发中的多线程编程总结
  4. 《微软应用架构指南》前言
  5. C++ 文件读写操作01
  6. 一位老工程师的忠告,切记!
  7. Python练习:斐波那契数列计算 B
  8. java 执行class顺序_java – @BeforeClass和inheritance – 执行顺序
  9. 【Kafka】Kafka connection to node 0 failed authentication due to SSL handshake failed
  10. node express创建项目步骤
  11. 【操作系统】—线程概念和多线程模型
  12. oracle 算年级,oracle 查询年级,班级,班级人数;
  13. MVC模式利用xib文件定制collectionCell
  14. Python中List,tuple,Dictionary之间的区别
  15. 中医移动医疗_人工智能为中医赋能 上海祉云医疗将再次亮相2021健博会北京展...
  16. 长字符串的算术编码matlab,算术编码及MATLAB实现
  17. 台风怎么看内存颗粒_【内存篇】能否Deja Vu?海力士DJR超频测试
  18. 一个未完毕创业项目的思考——创业杂记
  19. 学而思王帆初中语文教学视频
  20. ES — — elasticsearch初探

热门文章

  1. Django 点击刷新验证码
  2. 5, Swift tableView点击收起展开的效果
  3. office文档转html,OFFICE 文档转换为html在线预览
  4. Python爬取熊猫办公音频素材数据
  5. 阿里云 OSS 客户端直传 Policy 模式使用
  6. 蒙提霍尔问题(三门问题)的思考与贝叶斯分析
  7. DAC0832的多功能信号/波形发生器Proteus仿真设计,4种波形(正弦、三角、方波、锯齿),附仿真+C程序+论文等
  8. ArcGIS 计算椭球面积
  9. 欢迎使用CSDN-markdown编辑器231
  10. 深入浅出 HTTP协议