设计模式-简单工厂模式

这章主要记录了简单工厂模式


一、什么是简单工厂模式

  • 简单工厂模式 (Simple Factory 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: OperationFactory.java
 * @Description: 运算方法工厂类
 * @Author: xj
 * @Date: 2018/8/11 9:45
 */
public class OperationFactory {

    public static Operation getOperation(String operation) {
        switch (operation) {
            case "+": return new OperationAdd();
            case "-": return new OperationSub();
            case "*": return new OperationMul();
            case "/": return new OperationDiv();
            default: return null;
        }
    }
}

测试类

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

    public static void main(String[] args) throws Exception {
        Operation operationAdd = OperationFactory.getOperation("+");
        if (operationAdd != null) {
            double result = operationAdd.getResult(20, 5); // 25.0
            System.out.println(result);
        }

        Operation operationSub = OperationFactory.getOperation("-");
        if (operationSub != null) {
            double result = operationSub.getResult(20, 5); // 15.0
            System.out.println(result);
        }

        Operation operationMul = OperationFactory.getOperation("*");
        if (operationMul != null) {
            double result = operationMul.getResult(20, 5); // 100.0
            System.out.println(result);
        }

        Operation operationDiv = OperationFactory.getOperation("/");
        if (operationDiv != null) {
            double result = operationDiv.getResult(20, 5); // 4.0
            System.out.println(result);
        } 
    }
}

以上就是简单工厂模式的一个小例子

posted @ 2018-08-18 16:29  GeneXu  阅读(42)  评论(0)    收藏  举报