简单工厂模式
小菜工作一年多了,以前写代码很少关注设计模式的事情,一来没有系统的学习过设计模式,二来无论是项目还是产品的架构都是公司的牛人做的,自己也不用考虑这方面的东西,但是随着工作的深入,越来越觉得设计模式的重要性。面向对象的开发即继承、多态、封装,但是在面对比较复杂的项目或者产品时,好的设计模式更能体现或者说更好的实现面向对象编程的思想,所以从今天开始,小菜决定系统的学习下设计模式,和大家分享。
首先学习的是大家都熟知的简单工厂模式,我们先来看看简单工厂模式的UML类图:
从UML类图上我们可以看出,所有的运算类都继承自一个共同的父类,在父类中,提供了运算的方法,子类做具体的实现并返回结果。从UML类图可以看出,运算类和简单工厂类是关联的关系,即在工厂类中有存在一个类型为运算类的属性。具体的代码如下:
运算类及其子类:
View Code
1 package simpleFactory; 2 3 //基本运算类,提供运算方法的默认实现 4 public class BaseCalculate { 5 6 protected double numberA = 0; 7 protected double numberB = 0; 8 9 public double getResult(){ 10 double result = 0; 11 return result; 12 } 13 14 public double getNumberA() { 15 return numberA; 16 } 17 18 public void setNumberA(double numberA) { 19 this.numberA = numberA; 20 } 21 22 public double getNumberB() { 23 return numberB; 24 } 25 26 public void setNumberB(double numberB) { 27 this.numberB = numberB; 28 } 29 } 30 31 //加法类,继承自基本运算类,并重写运算方法,返回结果 32 public class AddCalculate extends BaseCalculate { 33 34 @Override 35 public double getResult() { 36 return numberA + numberB; 37 } 38 39 } 40 41 //减法类 42 public class SubCalculate extends BaseCalculate{ 43 @Override 44 public double getResult() { 45 return numberA - numberB; 46 } 47 } 48 49 //乘法类 50 public class MulCalculate extends BaseCalculate{ 51 @Override 52 public double getResult() { 53 return numberA * numberB; 54 } 55 } 56 57 //除法类 58 public class DivCalculate extends BaseCalculate{ 59 @Override 60 public double getResult() { 61 return numberA/numberB; 62 } 63 }
简单工厂类:
1 public class CalculateFatory { 2 public static BaseCalculate getRightCalculator(char operator){ 3 BaseCalculate calculator = null; 4 switch (operator) { 5 case '+': 6 calculator = new AddCalculate(); 7 break; 8 case '-': 9 calculator = new SubCalculate(); 10 break; 11 case '*': 12 calculator = new MulCalculate(); 13 break; 14 case '/': 15 calculator = new DivCalculate(); 16 break; 17 } 18 return calculator; 19 } 20 }
客户端调用:
1 1 public class MainClass { 2 2 public static void main(String[] args) { 3 3 BaseCalculate calculator = CalculateFatory.getRightCalculator('*'); 4 4 calculator.numberA = 2; 5 5 calculator.numberB = 3; 6 6 double result = calculator.getResult(); 7 7 System.out.println(result); 8 8 } 9 9 }
我们来思考一下为什么要用简单工厂模式,加入按照以前的代码,我们可能会将加减乘除四种运算包含在同一个类中,加入我们要对其中一个方法做新的实现,或者增加新的运算方法,那么我们需要对整个类进行重新编译,如果我们不小心把之前的方法改了呢?如果这是一个银行系统,我们可能会造成很大的误差或者损失,那么最好办法就是将各个方法分离,新的实现不印象其他的方法。那么这时候,我们呢就需要用到简单工厂模式了。
每天都要对自己清零,每天都要进步,哪怕只有一点点