设计模式专题2:简单工厂与策略模式的区别与联系

前言:加入阿里三周了,最近在开发项目的过程中遇到一个场景,结合使用了简单工厂与策略模式,稍微回想了一下,发现再次想不明白策略模式与简单工厂模式之间的区别了,就以此为契机发ATA的第一篇文章吧,想直接看结论的可以跳到最后。

1.简单工厂

  类图见下:
简单工厂-类图

全部的代码见git:https://github.com/somewaters/designPattern/tree/master/src/main/java/simpleFactory

只贴一下client调用代码

AbstractProduct product = ProductFactory.createProduct("A");
product.method();

适用场景为:client不关心对象的创建,只需要传给工厂类参数,获取到生产的对象后使用即可,对client隐藏了对象创建的过程。

简单工厂的创建对象不一定必须要if,else来进行对象的创建。比如

if("A".equals(param)){
    return  new ProductA();
}else if("B".equals(param)){
    new ProductB();
}else{
    new ProductC();
}

可以使用map属性,使用Spring Ioc的bean配置文件来进行对象的创建,这样变动的时候,不用改原有的工厂方法,只要新加实现,对bean配置进行修改即可。满足开闭原则,比如

Map productMap;

AbstractProduct createProduct(String param){
return productMap.get(param);

2.策略模式

类图见下

image

全部代码见git:https://github.com/somewaters/designPattern/tree/master/src/main/java/strategy

只贴一下Context和client代码

public class Context {
    private Strategy strategy;

    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public void method(){
        strategy.algorithm();
    }

}

client代码

public class client {
    public static void main(String[] args){
        Context context = new Context(new StrategyA());
        context.method();
    }
}

适用场景:同一业务场景,不同分支处理不同导致的复杂if else,使用策略模式可以规避此类代码。

if(a){

handleA();

}else if(b){

handleB();

}else if(c){

handleC();

}

else{

handleD();

}

3.区别

重点来了,两种模式的区别是什么呢?

网上的答案一般是,简单工厂关注对象的创建,而策略模式关注的是行为,我是看不明白。我自己理解的最大区别,没有之一,即以clinet视角看,对象创建的可见性不同。

从clinet使用角度来说,简单工厂中,client不知道对象是如何创建的,对象创建对client是隐藏的。client代码见下

AbstractProduct product = ProductFactory.createProduct("A");
product.method();

而策略模式,client需要自己创建好对象new StrategyA()传递给context,即对象创建对client是可见的。client代码见下

Context context = new Context(new StrategyA());
context.method();

策略模式最典型的其实是treeMap的Comparator,你作为client是需要自己实现一个Comparator类传递给treeMap的。

public TreeMap(Comparator comparator) {
    this.comparator = comparator;
}

到此,本文最关键的就结束了。

下面说说如何结合简单工厂和策略模式。

其实就是基于策略模式,将Context代码改造一下

public class Context {
    private Strategy strategy;

    //将Context初始化的方式变为简单工厂中的factory一样的逻辑即可。
    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public void method(){
        strategy.algorithm();
    }

}

你可能感兴趣的:(设计模式专题2:简单工厂与策略模式的区别与联系)