【创建型模式】工厂方法模式

142 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

回顾简单工厂模式

上回专栏介绍了简单工厂模式,它的UML类图是这样的

简单工厂模式中使用工厂类创建出加减乘除对应的四个‘产品’,此时我们创建对象是在工厂类中通过switch的case来决定。如果此时计算机需要增加一个取余的方法,我们如何做呢?

  1. 新建一个取余运算类继承父级运算类Operation
  2. 在工厂类OperationFactory的switch中新增一个case语句(需要修改这个类的代码)

新建个取余类不会影响什么,但是修改OperationFactory类中的代码就违反了开闭原则,并且每增加一个新算法类都需要修改工厂类中的代码!所以有了工厂方法!

我理解的工厂方法

先看下工厂方法的UML类图

对比两图,可以清晰的看到工厂方法将一个工厂变成了四个工厂,每个工厂都很专一,FactoryAdd工厂只生产加法对象,FactoryDiv工厂只生产除法对象,FactoryMul只生产乘法对象,FactorySub只生产减法对象。

工厂方法是简单工厂的延伸,通过回顾可以看到简单工厂的不足就在于不利于扩展。工厂方法完美解决了这一缺点,它将简单工厂模式中的工厂进一步抽象,抽成了万能工厂,这个万能工厂只提供生产对象的方法,把创建具体对象的权限交给了实现类

工厂方法模式实现计算器

工厂方法接口

public interface FactoryMethod {
    Operation createOperation();
}

实现工厂方法的工厂类

public class FactoryAdd implements FactoryMethod {

    @Override
    public Operation createOperation() {
        return new OperationAdd();
    }
}
public class FactoryDiv implements FactoryMethod {
    @Override
    public Operation createOperation() {
        return new OperationDiv();
    }
}
public class FactoryMul implements FactoryMethod {

    @Override
    public Operation createOperation() {
        return new OperationMul();
    }
}
public class FactorySub implements FactoryMethod {
    @Override
    public Operation createOperation() {
        return new OperationSub();
    }
}

测试

public class MainTest {
    public static void main(String[] args) {
        FactoryMethod factoryMethod = new FactorySub();
        Operation operation = factoryMethod.createOperation();
        operation.setNum1(2);
        operation.setNum2(3);
        System.out.println("计算结果是:" + operation.getResult());
    }
}

运行结果:
计算结果是:-1

总结

工厂方法模式用到了多态,所以保留了简单工厂优点,客服了它的缺点,工厂方法模式下新增一个取余的功能,不需要修改已有的代码,只需要增加一个生产取余对象的工厂类即可,但是这回增加一些开发量(简单工厂多几行代码,工厂方法需要加一个类)。

如果不知道为什么使用简单工厂的同学请看专栏内的简单工厂文章,硬核分析!

Evader1997:【简单工厂模式】我以为我真的了解面向对象编程15 赞同 · 5 评论文章