无论采用哪种设计模式,都是期望能更好地学习面向对象的分析设计编程思想,通过面向对象的三大特性:封装、继承、多态并把程序的耦合度降低。
以计算器为例子,计算器需要有UI设计并且也需要有最基本的加减乘除算法。下面分别依次渐进说明下简单工厂模式的演进过程。
原始写法
class program{
static void main(String args[]) {
try{
System.out.println("请输入数字A:");
String number1 = System.in.readline();
System.out.println("请输入运算符:");
String operator = System.in.readline();
System.out.println("请输入数字B:");
String number2 = System.in.readline();
switch(operator) {
case "+": {
// 加法运算
break;
}
case "-": {
// 减法运算
break;
}
case "*": {
// 乘法运算
break;
}
case "/": {
// 除法运算
break;
}
}
}
} catch(Exception e) {
// 打印错误信息。
}
// 输出运算结果
}
以上这个写法,是最有可能出现的初级写法,在扩展性以及可维护性上都极差。
接着说封装后的程序
// 封装运算的方法
public class operation {
public static double getResult(double number1,double number2, String operate) {
switch(operator) {
case "+": {
// 加法运算
break;
}
case "-": {
// 减法运算
break;
}
case "*": {
// 乘法运算
break;
}
case "/": {
// 除法运算
break;
}
}
}
}
// return 计算结果
}
// 客户端代码
static void main(String args[]) {
try{
System.out.println("请输入数字A:");
String number1 = System.in.readline();
System.out.println("请输入运算符:");
String operator = System.in.readline();
System.out.println("请输入数字B:");
String number2 = System.in.readline();
// 计算结果
operation.getResult(number1,number2, operator)
} catch(Exception e) {
// 打印错误信息
}
}
以上写法对运算进行了封装,但是耦合性还是太强,譬如如果现在需要加入一个计算标准差的运算,应该怎么做? 是否重写operation类? 这里最主要会涉及一个安全问题:如何保障你新增了的代码块不会影响之前的业务?所以,也会引申出今天的主题简单的工厂模式。
简单工厂模式
// 1. 定义抽象 运算
public abstract Operation {
public double number1 = 0;
public double number2 = 0;
// 返回运算结果
pubic double getResult();
}
// 2. 封装每个运算,
public class [加、减、乘、除] extend Operation {
public double getResult() {
// 实现运算
}
}
// 简单工厂类
public class OperatorFactory {
public static Operation createOperate(String operate) {
Operation oper = null;
switch (operate){
case "+" :{
oper = new 加法();
}
case "-" :{
oper = new 减法();
}
// 乘、除以此类推
}
return oper;
}
}
// 客户端代码
Operation oper;
oper = OperationFactory.createOperte("+");
oper.number1 = 1;
oper.number2 = 2;
double result = oper.getResult();
按照以上的方法去实现简单工厂类后,以后我们需要添加新的运算,只需要继承operation,实现运算方法即可,也能确保每次只修改修改的部分而不影响之前其他的运算逻辑,让代码更具有可维护性、更聚焦。