一、简单工厂模式

前言:演变流程

基本功能的实现-》功能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 }

 

posted @ 2018-02-27 22:16  夕阳游子  阅读(174)  评论(0编辑  收藏  举报