设计模式最简Demo:工厂方法模式[Factory Method Pattern]

1. 程序需求

在简单工厂模式中,我们实现了一个简单的计算器,客户端在不知道运算类的情况下只需要传入一个简单的运算符就可以获取相应的操作进行运算,但是,如果我们想增加一个运算法则,比如乘方,我们考虑一下程序中需要修改的地方,首先需要扩展Operation类,增加一个乘方运算的子类,同时需要修改OperationFactory类,修改分支语句,添加case分支,这显然不满足关闭-开放原则,我们对扩展开放了,同时也对修改开放了,工厂方法模式可以改善这个问题。

2. UML图

设计模式最简Demo:工厂方法模式[Factory Method Pattern]_第1张图片

3. Java实现

Operation及其子类见本系列文章中的简单工厂方法。

IFactory

package factory_method_pattern.caculate;

import simple_factory_pattern.caculate.Operation;

public interface IFactory {
    Operation createOperate();
}

FactoryAdd

package factory_method_pattern.caculate;

import simple_factory_pattern.caculate.Operation;
import simple_factory_pattern.caculate.OperationAdd;

public class FactoryAdd implements IFactory {
    @Override
    public Operation createOperate() {
        return new OperationAdd();
    }
}

FactorySub

package factory_method_pattern.caculate;

import simple_factory_pattern.caculate.Operation;
import simple_factory_pattern.caculate.OperationSub;

public class FactorySub implements IFactory {
    @Override
    public Operation createOperate() {
        return new OperationSub();
    }
}

FactoryMul

package factory_method_pattern.caculate;

import simple_factory_pattern.caculate.Operation;
import simple_factory_pattern.caculate.OperationMul;

public class FactoryMul implements IFactory {
    @Override
    public Operation createOperate() {
        return new OperationMul();
    }
}

FactoryDiv

package factory_method_pattern.caculate;

import simple_factory_pattern.caculate.Operation;
import simple_factory_pattern.caculate.OperationDiv;

public class FactoryDiv implements IFactory {
    @Override
    public Operation createOperate() {
        return new OperationDiv();
    }
}

Test

package factory_method_pattern.caculate;

import simple_factory_pattern.caculate.Operation;

public class Test {
    public static void main(String[] args) {
        IFactory factory = new FactoryAdd();
        Operation operation = factory.createOperate();
        operation.numberA = 2;
        operation.numberB = 3;
        System.out.println(operation.getResult());
    }
}

4. 总结

工厂方法模式和简单工厂模式对比,工厂方法模式需要修改的类只有客户端类,而不用对原有工厂类进行修改,在工厂方法模式中根据需求同时扩展实体类和工厂类即可实现程序功能的扩展,同时不需要对程序做很大的改动。但是缺点是增加了开放量,需要同时扩展实体类和工厂类。

你可能感兴趣的:(设计模式)