前言
话说设计模式是我们面试中经常遇到的问题, 但是开发中遇到的也不少. 之前一直想学设计模式, 然后总结写一些文章, 但一直忙于其它事情, 现在终于要学习设计模式, 参考的书籍是《大话设计模式》, 这本书写得通俗易懂, 推荐大家都去看一下.
场景描述
借用书中示例问题, 计算两个数的加, 减, 乘, 除等其它运算, 一般我们的思维是自上而下处理问题, 也就造成了运算两个数就要经过多次判断.
场景示例
两个数之前的算法运算, 如下面代码所示:
- package me.xueyao;
- /**
- * @author Simon.Xue
- * @date 2019-12-30 22:54
- **/
- public class OperationHello {
- public static void main(String[] args) {
- System.out.println(getResult("*", 1, 3));
- }
- public static int getResult(String operationStr, int number1, int number2) {
- int result = 0;
- switch (operationStr) {
- case "+":
- result = number1 + number2;
- break;
- case "-":
- result = number1 - number2;
- break;
- case "*":
- result = number1 * number2;
- break;
- case "/":
- result = number1 / number2;
- break;
- }
- return result;
- }
- }
此处的代码要判断四次, 但是如果再增加其它的运算, 会在原来基础上又增加条件判断. 以后, 随着业务有扩展会不停添加判断条件. 代码的耦合度会越来越高, 如果修改某一处运算的问题, 就造成线上业务不能访问相关运算的功能, 必须要修改好问题, 其它的运算功能才能使用.
解决办法
现在可以用到我们所说的简单工厂模式, 首先, 我们要想, 加, 减, 乘, 除运算都属于运算子类, 所以我们创建一个运算父类 Operation .class
- package me.xueyao;
- /**
- * @author Simon.Xue
- * @date 2019-12-30 22:18
- **/
- public abstract class Operation {
- private int number1;
- private int number2;
- public int getNumber1() {
- return number1;
- }
- public void setNumber1(int number1) {
- this.number1 = number1;
- }
- public int getNumber2() {
- return number2;
- }
- public void setNumber2(int number2) {
- this.number2 = number2;
- }
- public abstract int getResult();
- }
加, 减, 乘, 除四则运算, 我们分别创建 OperationAdd.class,OperationSub.class,OperationMul.class,OperationDiv.class 四个子类分别继承运算父类 Operation.class, 实现其中计算方法.
- package me.xueyao;
- /**
- * @author Simon.Xue
- * @date 2019-12-30 22:22
- **/
- public class OperationAdd extends Operation {
- @Override
- public int getResult() {
- return getNumber1() + getNumber2();
- }
- }
- package me.xueyao;
- /**
- * @author Simon.Xue
- * @date 2019-12-30 22:22
- **/
- public class OperationSub extends Operation {
- @Override
- public int getResult() {
- return getNumber1() - getNumber2();
- }
- }
- package me.xueyao;
- /**
- * @author Simon.Xue
- * @date 2019-12-30 22:25
- **/
- public class OperationMul extends Operation {
- @Override
- public int getResult() {
- return getNumber1() * getNumber2();
- }
- }
- package me.xueyao;
- /**
- * @author Simon.Xue
- * @date 2019-12-30 22:26
- **/
- public class OperationDiv extends Operation {
- @Override
- public int getResult() {
- return getNumber1() / getNumber2();
- }
- }
当我们要使用运算方法时, 只需要创建其对象, 再执行计算方法, 便可计算两个数的运算, 但是现在又有一个问题, 就是每种运算方式都要创建对象. 都要暴露父类对象, 我们可以创建一个工厂类, 由工厂类来创建所需要的对象, 如下代码如示
- package me.xueyao;
- /**
- * @author Simon.Xue
- * @date 2019-12-30 22:30
- **/
- public class OperationFactory {
- public static Operation createOperation(String operationStr) {
- Operation operation = null;
- switch (operationStr) {
- case "+":
- operation = new OperationAdd();
- break;
- case "-":
- operation = new OperationSub();
- break;
- case "*":
- operation = new OperationMul();
- break;
- case "/":
- operation = new OperationDiv();
- break;
- }
- return operation;
- }
- }
总结
简单工厂模式, 是设计模式中比较简单的一种模式, 但是它每多出一种需求, 就要创建一个类, 总体来说用起来还不错. 文章如有问题, 请联系我.
来源: http://www.bubuko.com/infodetail-3358628.html