设计模式-工厂方法模式

上次巩固了简单工厂模式,这次主要记录下工厂模式


一、什么是工厂方法模式

  • 工厂方法模式 (Factory Method Pattern),是简单工厂模式的进一步抽象和推广
  • 定义了一个用于创建对象的接口,让子类决定实例化哪一个工厂类,使一个类的实例化延迟到其子类
  • 遵循了 开放-封闭 原则
  • 优点:
    • 克服了简单工厂违背开放-封闭原则的缺点
    • 封装了对象的创建过程,对于客户端来说,只需要关心接口,而不用关心对象究竟是如何产生的
  • 缺点:
    • 每增加一个产品,都要相应地加一个工厂类,增加了额外的开发量

二、工厂方法模式UML图

这里写图片描述


三、工厂方法模式示例

运算方法抽象类

/**
 * @Title: Operation.java
 * @Description: 运算方法抽象类
 * @Author: xj
 * @Date: 2018/8/11 9:37
 */
public abstract class Operation {

    public abstract double getResult(double numberA, double numberB) throws Exception;
}

运算方法具体实现

/**
 * @Title: OperationAdd.java
 * @Description: 加法类
 * @Author: xj
 * @Date: 2018/8/11 9:40
 */
public class OperationAdd extends Operation {

    @Override
    public double getResult(double numberA, double numberB) {
        return numberA + numberB;
    }
}
/**
 * @Title: OperationSub.java
 * @Description: 减法类
 * @Author: xj
 * @Date: 2018/8/11 9:44
 */
public class OperationSub extends Operation {

    @Override
    public double getResult(double numberA, double numberB) {
        return numberA - numberB;
    }
}
/**
 * @Title: OperationMul.java
 * @Description: 乘法类
 * @Author: xj
 * @Date: 2018/8/18 14:26
 */
public class OperationMul extends Operation {

    @Override
    public double getResult(double numberA, double numberB) {
        return numberA * numberB;
    }
}
/**
 * @Title: OperationDiv.java
 * @Description: 除法类
 * @Author: xj
 * @Date: 2018/8/18 14:27
 */
public class OperationDiv extends Operation {

    @Override
    public double getResult(double numberA, double numberB) throws Exception {
        if (numberB == 0) {
            throw new Exception("除数不能为0");
        }
        return numberA / numberB;
    }
}

运算方法工厂接口

/**
 * @Title: IFactory.java
 * @Description: 工厂接口
 * @Author: xj
 * @Date: 2018/8/19 9:05
 */
public interface IFactory {

    Operation getOperation();
}

运算方法工厂具体实现

/**
 * @Title: AddFactory.java
 * @Description: 加法工厂类
 * @Author: xj
 * @Date: 2018/8/19 9:08
 */
public class AddFactory implements IFactory {

    @Override
    public Operation getOperation() {
        return new OperationAdd();
    }
}
/**
 * @Title: SubFactory.java
 * @Description: 减法工厂类
 * @Author: xj
 * @Date: 2018/8/19 9:09
 */
public class SubFactory implements IFactory {

    @Override
    public Operation getOperation() {
        return new OperationSub();
    }
}
/**
 * @Title: MulFactory.java
 * @Description: 乘法工厂类
 * @Author: xj
 * @Date: 2018/8/19 9:10
 */
public class MulFactory implements IFactory {

    @Override
    public Operation getOperation() {
        return new OperationMul();
    }
}
/**
 * @Title: DivFactory.java
 * @Description: 除法工厂类
 * @Author: xj
 * @Date: 2018/8/19 9:11
 */
public class DivFactory implements IFactory {

    @Override
    public Operation getOperation() {
        return new OperationDiv();
    }
}

测试类

/**
 * @Title: Test.java
 * @Description: 测试类
 * @Author: xj
 * @Date: 2018/8/19 9:12
 */
public class Test {

    public static void main(String[] args) throws Exception {
        IFactory addFactory = new AddFactory();
        Operation operationAdd = addFactory.getOperation();
        double result1 = operationAdd.getResult(20, 5); // 25.0
        System.out.println(result1);

        IFactory subFactory = new SubFactory();
        Operation operationSub = subFactory.getOperation();
        double result2 = operationSub.getResult(20, 5); // 15.0
        System.out.println(result2);

        IFactory mulFactory = new MulFactory();
        Operation operationMul = mulFactory.getOperation();
        double result3 = operationMul.getResult(20, 5); // 100.0
        System.out.println(result3);

        IFactory divFactory = new DivFactory();
        Operation operationDiv = divFactory.getOperation();
            double result4 = operationDiv.getResult(20, 5); // 4.0
        System.out.println(result4);
    }
}

以上就是工厂方法模式的一个小例子

posted @ 2018-08-19 10:43  GeneXu  阅读(62)  评论(0)    收藏  举报