无论采用哪种设计模式,都是期望能更好地学习面向对象的分析设计编程思想,通过面向对象的三大特性:封装、继承、多态并把程序的耦合度降低。
以计算器为例子,计算器需要有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,实现运算方法即可,也能确保每次只修改修改的部分而不影响之前其他的运算逻辑,让代码更具有可维护性、更聚焦。