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

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

作者: 北交吴志炜 | 来源:发表于2019-04-20 18:31 被阅读0次

前言:加入阿里三周了,最近在开发项目的过程中遇到一个场景,结合使用了简单工厂与策略模式,稍微回想了一下,发现再次想不明白策略模式与简单工厂模式之间的区别了,就以此为契机发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<String, AbstractProduct> 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<? super K> 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:简单工厂与策略模式的区别与联系

    前言:加入阿里三周了,最近在开发项目的过程中遇到一个场景,结合使用了简单工厂与策略模式,稍微回想了一下,发现再次想...

  • 设计模式---iOS笔记摘录

    目的 原则 设计模式 简单工厂模式 与 策略模式 Calcultate计算抽象类 Reduce减法类 Plus...

  • 设计模式

    软件开发中常用设计模式和设计原则有哪些? ##设计模式: * 1、简单工厂模式(Factory) * 2、策略模式...

  • 相近设计模式比较

    设计模式干货: 简单工厂模式 vs. 工厂模式 vs. 抽象工厂模式简单工厂和工厂模式区别? 简单工厂没有多个子类...

  • 设计模式-工厂模式

    设计模式1 设计模式2 工厂模式 工厂模式可简单的分为三类:简单工厂,工厂方法,抽象工厂 简单工厂模式 定义 简单...

  • PHP-浅谈单例模式和工厂模式

    PHP中常用的设计模式有单例模式、工厂模式(简单工厂模式、工厂方法模式和抽象工厂方法模式)、适配模式、策略模式。 ...

  • 工厂方法模式

    这章会引用到 简单工厂模式的代码,主要就是用来区分 简单工厂模式与工厂方法模式的区别简单工厂模式请自行跳转http...

  • Java 最常见的 208 道面试题:第九模块和第十模块答案

    九、设计模式 88. 说一下你熟悉的设计模式? 89. 简单工厂和抽象工厂有什么区别? 简单工厂模式: 这个模式本...

  • iOS开发之设计模式 - 策略模式

    由《大话设计模式 - 策略模式》的OC和部分Swift的语言转义 策略模式 继上一篇《简单工厂模式》 策略模式,定...

  • iOS知识点整理

    一、工厂模式 1、简介 2、简单工厂模式 2、抽象工厂模式 二、Swift与Objective_C

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/jjblgqtx.html