一、简单工厂模式
前言:演变流程
基本功能的实现-》功能bug的改进-》面向对象的思考-》紧耦合与松耦合
案例来源:大话设计模式:设计一个计算器
1. 最普通的计算器设计,仅仅实现了功能
不足之处:(1)有三次无用的if判断(2)思考不周到,如果除号为0的情况怎么办?
1 /* 2 * 最普通的计算器设计,仅仅实现了功能 3 * 不足之处:(1)有三次无用的if判断(2)思考不周到,如果除号为0的情况怎么办? 4 * @author ckm123 5 */ 6 public class TestDemo1 { 7 public static void main(String[] args) { 8 //两个数值和一个符号,原本是通过Scannel输入,我改写成写死了。 9 int numberA = 5; 10 int numberB = 3; 11 String 符号 = "-"; 12 13 if (符号 == "+") { 14 System.out.println("结果:" + (numberA + numberB)); 15 } 16 if (符号 == "-") { 17 System.out.println("结果:" + (numberA - numberB)); 18 } 19 if (符号 == "*") { 20 System.out.println("结果:" + (numberA * numberB)); 21 } 22 if (符号 == "/") { 23 System.out.println("结果:" + (numberA / numberB)); 24 } 25 } 26 } 27
2. 改进“1”中存在的问题,使用switch,同时增加了被除数为0的情况
1 package com.xyyz.one; 2 /* 3 * 修补了TestDemo1不足之处:(1)有三次无用的if判断(2)思考不周到,如果除号为0的情况怎么办? 4 * @author ckm123 5 */ 6 public class TestDemo2 { 7 public static void main(String[] args) { 8 //两个数值和一个符号,原本是通过Scannel输入,我改写成写死了。 9 int numberA = 5; 10 int numberB = 0; 11 String 符号 = "/"; 12 13 switch (符号) { 14 case "+": 15 System.out.println("结果:" + (numberA + numberB)); 16 break; 17 case "-": 18 System.out.println("结果:" + (numberA - numberB)); 19 break; 20 case "*": 21 System.out.println("结果:" + (numberA * numberB)); 22 break; 23 case "/": 24 if (numberB != 0) { 25 System.out.println("结果:" + (numberA / numberB)); 26 } else { 27 System.out.println("被除数不能为零"); 28 } 29 break; 30 default: 31 break; 32 } 33 } 34 }
3. 客户端和业务都混合在一起,不符合面向对象思想,现在分离,客户端和业务分开,业务可以被其他客户端使用,实现复用,维护性也更好
3.1业务层的代码
1 public class Operation { 2 public static int getResult(int numberA, int numberB, String 符号) { 3 int result = 0; 4 switch (符号) { 5 case "+": 6 result = numberA + numberB; 7 break; 8 case "-": 9 result = numberA - numberB; 10 break; 11 case "*": 12 result = numberA * numberB; 13 break; 14 case "/": 15 result = numberA / numberB; 16 break; 17 } 18 return result; 19 } 20 }
3.2客户端的代码
1 /* 2 * 面向对象,进行了,客户端和业务的分离 3 * @author ckm123 4 */ 5 public class TestDemo3 { 6 public static void main(String[] args) { 7 // 两个数值和一个符号,原本是通过Scannel输入,我改写成写死了。 8 int numberA = 5; 9 int numberB = 2; 10 String 符号 = "/"; 11 if (numberB == 0) { 12 System.out.println("被除数不能为零"); 13 return; 14 } 15 int result = Operation.getResult(numberA, numberB, 符号); 16 System.out.println("结果:" + result); 17 } 18 }
4. 紧耦合和松耦合,增加功能在业务模块里面修改可能修改错误,使用继承和多态进行运算分离。
4.1加减乘除类
1 public class OperationDiv implements Operation { 2 @Override 3 public int getResult(int numberA, int numberB) { 4 return numberA / numberB; 5 } 6 } 7 public class OperationMul implements Operation { 8 @Override 9 public int getResult(int numberA, int numberB) { 10 return numberA * numberB; 11 } 12 } 13 public class OperationSub implements Operation { 14 @Override 15 public int getResult(int numberA, int numberB) { 16 return numberA - numberB; 17 } 18 } 19 public class OperationAdd implements Operation { 20 @Override 21 public int getResult(int numberA, int numberB) { 22 return numberA + numberB; 23 } 24 }
4.2简单运算工厂类
1 /* 2 * 工厂类,用于判定创建哪个对象 3 */ 4 public class OperationFactory { 5 public static Operation getResult( String 符号) { 6 Operation oper = null; 7 switch (符号) { 8 case "+": 9 oper = new OperationAdd(); 10 break; 11 case "-": 12 oper = new OperationSub(); 13 break; 14 case "*": 15 oper = new OperationMul(); 16 break; 17 case "/": 18 oper = new OperationDiv(); 19 break; 20 } 21 return oper; 22 } 23 }
4.3客户端类
1 /* 2 * 紧耦合与松耦合,使用继承和多态,进行运算分离。 3 * @author ckm123 4 */ 5 public class TestDemo4 { 6 public static void main(String[] args) { 7 // 两个数值和一个符号,原本是通过Scannel输入,我改写成写死了。 8 int numberA = 5; 9 int numberB = 2; 10 String 符号 = "/"; 11 if (numberB == 0) { 12 System.out.println("被除数不能为零"); 13 return; 14 } 15 Operation operation = OperationFactory.getResult(符号); 16 System.out.println("结果:" + operation.getResult(numberA, numberB)); 17 } 18 }