本人感觉书中讲的简单易懂,并对书中的Demo做了Java实现,对于简单工厂模式,我的理解就是将一些基础的,具有继承关系的数据进行封装,在具体的实现中进行继承或实现,这样可以使用较少的代码去实现同样的功能。代码的可读性以及可维护性都会大大的提高,废话不多说,上代码。
当前案例是实现一个计算器,主要是实现加减乘除方法。其实,不论是加减乘除还是其他的计算,都是属于运算的一种,最终都是要返回一个计算结果,只不过中间的实现过程不同。所以我们将计算单独抽出为一个IOperation接口:
/**
* 计算接口
* @author weiming.liu
* @Date 2019年4月24日 上午12:05:28
*/
public interface IOperation {
public double getResult(double _numberA, double _numberB);
}
有了接口之后,我们需要去实现具体的加减乘除运算,分别定义加减乘除四个运算类并实现IOperation接口,对IOperation中的计算方法进行重写,就可以返回对应的计算值:
/**
* 加法运算
*
* @author weiming.liu
* @Date 2019年4月23日 下午11:46:19
*/
public class OperationAdd implements IOperation {
@Override
public double getResult(double _numberA, double _numberB) {
return _numberA + _numberB;
}
}
/**
* 减法运算
*
* @author weiming.liu
* @Date 2019年4月23日 下午11:46:19
*/
public class OperationSub implements IOperation {
@Override
public double getResult(double _numberA, double _numberB) {
return _numberA - _numberB;
}
}
/**
* 乘法运算
*
* @author weiming.liu
* @Date 2019年4月23日 下午11:46:19
*/
public class OperationMul implements IOperation {
@Override
public double getResult(double _numberA, double _numberB) {
return _numberA * _numberB;
}
}
/**
* 除法运算
*
* @author weiming.liu
* @Date 2019年4月23日 下午11:46:19
*/
public class OperationDiv implements IOperation {
@Override
public double getResult(double _numberA, double _numberB) {
if (_numberB == 0) {
throw new RuntimeException("除数B不能为0.");
}
return _numberA / _numberB;
}
}
上面分别定义了加减乘除四种运算类,分别对IOperation接口中的getResult方法进行了重写,返回对应的运算结果;
那么定义上述四个运算类的目的是为了通过一个统一的方法去获取到对应的运算类对象,这样做的目的是保证如果以后有新的运算加入,比如求平方根运算的时候,不需要去变动加减乘除四个实现类,或者在以后加法的实现逻辑有变动,只需要对加法类进行重写即可,其他位置逻辑不会变动,维护性和可拓展性更高。
运算工厂类定义如下:
/**
* 运算类工厂
*
* @author weiming.liu
* @Date 2019年4月23日 下午11:55:25
*/
public class OperationFactory {
IOperation oper = null;
public IOperation createOperate(String operate){
switch (operate) {
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
default:
break;
}
return oper;
}
}
通过工厂类,根据传入的运算符,创建对应的运算实现类,通过getResult可获取到计算结果。
main函数实现如下:
/**
* 简单工厂模式实现计算器
* @author weiming.liu
* @Date 2019年4月24日 上午12:15:25
*/
public class Calculator {
public static void main(String[] args) {
double numberA = 0d;
double numberB = 0d;
String operate = "";
double result = 0d;
try {
Scanner sc = new Scanner(System.in);
System.out.println("Java简单工厂模式计算器:");
System.out.println("请输入数字A:");
numberA = sc.nextDouble();
System.out.println("请选择运算符号(+、-、*、/):");
operate = sc.next();
System.out.println("倾诉如数字B:");
numberB = sc.nextDouble();
IOperation operation = new OperationFactory().createOperate(operate);
if (operation == null) {
System.out.println("请在“+、-、*、/”选择正确的运算符");
} else {
result = operation.getResult(numberA, numberB);
System.out.println(String.format("您的计算结果是:%s %s %s = %s", numberA, operate, numberB, result));
}
sc.close();
} catch (Exception e) {
System.out.println(String.format("您的输入有误:%s", e.getMessage()));
}
}
}
减法运算结果为:
其他运算的结果可以将代码考到本地运行即可。
欢迎交流。