自学大话设计模式——简单工厂模式与策略模式

本人的几点浅见,各位大大不喜勿喷,欢迎带批评不带批评带表扬不带表扬的文明的评论。
今天通读了《大话设计模式》这本书的简单工厂模式与策略模式两个模式的介绍,生出部分感想以及疑问在此记录以便后查

简单工厂模式:

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类
先说说简单工厂模式,书中以计算器为例子引入工厂模式。场景为设计一个计算器类,分别拥有加减乘除四操作。于是便生成了一个操作类并有四个实现类(“加”、“减”、“乘”,“除”),类图如下:

自学大话设计模式——简单工厂模式与策略模式_第1张图片

因为书中所用语言为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折实现类)。两种模式相辅相成。

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

你可能感兴趣的:(自学系列-设计模式)