博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自学大话设计模式——简单工厂模式与策略模式
阅读量:4290 次
发布时间:2019-05-27

本文共 2661 字,大约阅读时间需要 8 分钟。

本人的几点浅见,各位大大不喜勿喷,欢迎带批评不带批评带表扬不带表扬的文明的评论。

今天通读了《大话设计模式》这本书的简单工厂模式与策略模式两个模式的介绍,生出部分感想以及疑问在此记录以便后查

简单工厂模式:

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类

先说说简单工厂模式,书中以计算器为例子引入工厂模式。场景为设计一个计算器类,分别拥有加减乘除四操作。于是便生成了一个操作类并有四个实现类(“加”、“减”、“乘”,“除”),类图如下:

类图

因为书中所用语言为C#,在这里换为Java的话我认为同样可以用接口+实现类来完成。类图与上图相似。优点是方便类方法的扩展和维护。核心代码如下:

// 接口类public interface Operate {
/** * 传入两个数字,进行运算 * @param numA * @param numB * @return */ double oprate(String numA,String numB);}// 实现类public class OperateAddImpl implements Operate {
@Override public double oprate(String numA, String numB) { int a = 0, b = 0; if (!StringUtils.isEmptyString(numA)){ a = Integer.valueOf(numA); } if (!StringUtils.isEmptyString(numB)){ b = Integer.valueOf(numB); } return a + b; }}...// 其余四个实现类类似,不在此一一赘述// 工厂类public class CaculaterFactory {
public static Operate getOperateImpl(String operator){ switch (operator){ case "+": return new OperateAddImpl(); case "-": return new OperateSubImpl(); case "*": return new OperateMulImpl(); case "/": return new OperateDivImpl(); } return null; }}//客户端public class Client {
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Please input the first num"); String strA = scanner.next(); System.out.println("Please input the operator"); String operator = scanner.next(); System.out.println("Please input the second nu,"); String strB = scanner.next(); Operate operate = CaculaterFactory.getOperateImpl(operator); double res = operate.oprate(strA, strB); System.out.println("The result is :" + res); }}

策略模式

定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换

其实我感觉策略模式在目的上与工厂模式是类似的,都是方便以后方法的扩展和维护。书中给出的例子,是针对商场打折的场景做出的代码实例,想让我们理解“将每个算法都封装起来”,最后与简单工厂模式的结合,简直天衣无缝趋近完美,但这样也让我对两个本就相近的模式更加混淆,经过在网上查证以及翻阅设计模式之禅后,总结了一下两个模式的大体不同。

简单工厂模式与策略模式的不同

通俗讲,简单工厂模式是用户只要将相应的条件扔给工厂类,工厂类即可为你返回最正确的执行类。例如,我只要传入两个数和加号,工厂类即可为我返回加法实现类来为我实现计算。而策略模式呢,则需要你自己确定是用哪个实现类。也就是说,你不单要告诉策略模式中Context类你要使用什么数字和什么符号,还要告诉它你要使用什么类来执行计算方法。从头到尾基本上都是自己来选择,没有工厂类那么“智能”。于是,你会发现工厂类+策略类的混合模式是多么完美的。

看到这里你可能要问,那么工厂模式和策略模式各自有什么优点呢。或者问,既然有了工厂模式,为什么还要有策略模式呢。我的看法是这样的。两个模式之间完全不是有你没我的关系,工厂模式所针对的是方便于类的扩展,而策略模式所注重的则是策略之间的切换。意思就是说,有了工厂模式,商场打折活动,原来只有5折优惠的功能,现要加入7折优惠的功能,则只需要增加一个7折计算类即可。而如果今天商场打5折,明天商场打7折(两个实现类都已经存在),则在策略模式下,只需要更改传入Context中商场打折的实现类即可(由5折实现类修改为7折实现类)。两种模式相辅相成。

今天就说到这,很多东西以为自己弄懂了,可真到写博客时才发现自己还有好多没有弄懂的地方,有的以为懂了的地方其实也是半知半解,还是要多动笔多总结。写的有点乱,希望以后有时间“重构”下文章吧。

你可能感兴趣的文章
关于如何动态导出Excel表格——选择想要导出的字段
查看>>
我理解的java-内存模型
查看>>
在 Linux 上给用户赋予指定目录的读写权限
查看>>
java高并发解决方案
查看>>
Mysql 面试实战系列(四)——快马扬鞭
查看>>
数据库SQL优化大总结之 百万级数据库优化方案
查看>>
WEB服务器调优
查看>>
常用函数语法
查看>>
tomcat 7负载均衡-memcache-session
查看>>
MySQL无法创建表的问题分析(r12笔记第73天)
查看>>
JavaScript数据类型的强制转化-数值
查看>>
如何使用Spring Boot快速创建Web应用
查看>>
学习三十四天笔记——mysql事务触发器函数过程:变量
查看>>
Java面向对象,基本类型包装类
查看>>
MyBatis 原理浅析 3——数据操作
查看>>
一篇Mysql注入最全详解(2)
查看>>
Java面向对象,单例设计模式
查看>>
操作mysql用户,权限
查看>>
并发控制——悲观锁和乐观锁详解
查看>>
如何低成本搭建高性能分布式搜索引擎?
查看>>