简单工厂模式

  小菜工作一年多了,以前写代码很少关注设计模式的事情,一来没有系统的学习过设计模式,二来无论是项目还是产品的架构都是公司的牛人做的,自己也不用考虑这方面的东西,但是随着工作的深入,越来越觉得设计模式的重要性。面向对象的开发即继承、多态、封装,但是在面对比较复杂的项目或者产品时,好的设计模式更能体现或者说更好的实现面向对象编程的思想,所以从今天开始,小菜决定系统的学习下设计模式,和大家分享。

  首先学习的是大家都熟知的简单工厂模式,我们先来看看简单工厂模式的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 }

   我们来思考一下为什么要用简单工厂模式,加入按照以前的代码,我们可能会将加减乘除四种运算包含在同一个类中,加入我们要对其中一个方法做新的实现,或者增加新的运算方法,那么我们需要对整个类进行重新编译,如果我们不小心把之前的方法改了呢?如果这是一个银行系统,我们可能会造成很大的误差或者损失,那么最好办法就是将各个方法分离,新的实现不印象其他的方法。那么这时候,我们呢就需要用到简单工厂模式了。

posted @ 2012-10-23 11:14  寒剑飘香  阅读(224)  评论(0编辑  收藏  举报