前言
话说设计模式是我们面试中经常遇到的问题,但是开发中遇到的也不少。之前一直想学设计模式,然后总结写一些文章,但一直忙于其它事情,现在终于要学习设计模式,参考的书籍是《大话设计模式》,这本书写得通俗易懂,推荐大家都去看一下。
场景描述
借用书中示例问题,计算两个数的加、减、乘、除等其它运算,一般我们的思维是自上而下处理问题,也就造成了运算两个数就要经过多次判断。
场景示例
两个数之前的算法运算,如下面代码所示:
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;
}
}
总结
简单工厂模式,是设计模式中比较简单的一种模式,但是它每多出一种需求,就要创建一个类,总体来说用起来还不错。文章如有问题,请联系我。
网友评论