本人的几点浅见,各位大大不喜勿喷,欢迎带批评不带批评带表扬不带表扬的文明的评论。
今天通读了《大话设计模式》这本书的简单工厂模式与策略模式两个模式的介绍,生出部分感想以及疑问在此记录以便后查
简单工厂模式:
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类
先说说简单工厂模式,书中以计算器为例子引入工厂模式。场景为设计一个计算器类,分别拥有加减乘除四操作。于是便生成了一个操作类并有四个实现类(“加”、“减”、“乘”,“除”),类图如下:
因为书中所用语言为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折实现类)。两种模式相辅相成。
今天就说到这,很多东西以为自己弄懂了,可真到写博客时才发现自己还有好多没有弄懂的地方,有的以为懂了的地方其实也是半知半解,还是要多动笔多总结。写的有点乱,希望以后有时间“重构”下文章吧。