本文共 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折实现类)。两种模式相辅相成。
今天就说到这,很多东西以为自己弄懂了,可真到写博客时才发现自己还有好多没有弄懂的地方,有的以为懂了的地方其实也是半知半解,还是要多动笔多总结。写的有点乱,希望以后有时间“重构”下文章吧。