首页 > 代码库 > 大话设计模式第一章之简单工厂模式

大话设计模式第一章之简单工厂模式

package com.dp.simpleFactory;

//计算器作为抽象类  定义一个计算需要什么    子类继承了两个数字      并且要有自己的计算实现方法
public abstract class  Calculator {
     protected double numberA=0;
     protected double numberB=0;
    public double getNumberA() {
        return numberA;
    }
    public void setNumberA(double numberA) {
        this.numberA = numberA;
    }
    public double getNumberB() {
        return numberB;
    }
    public void setNumberB(double numberB) {
        this.numberB = numberB;
    }    
     
    
    public abstract double getResult() throws Exception;    
}


class CalculatorAdd extends Calculator 
{
    @Override
    public double getResult() {
        double result=numberA+numberB;
        return result;
    }
}


class CalculatorMinus extends Calculator 
{
    @Override
    public double getResult() {
        double result=numberA-numberB;
        return result;
    }
}



class CalculatorMultiply extends Calculator 
{
    @Override
    public double getResult() {
        double result=numberA*numberB;
        return result;
    }
}



class CalculatorDivide extends Calculator 
{
    @Override
    public double getResult() throws Exception {
        double result=numberA/numberB;
        if(numberB==0)
            throw new Exception("除数不能为0");
        return result;
    }
}


//问题是:怎么根据输入而得到指定的类?

//使用简单工厂设计模式   根据操作符得到某个类(根据xx条件得到XX类)
class CalculatorFactory
{
    public static Calculator createCalculator(String operate)
    {
       Calculator cal=null;
       switch(operate)
       {
       case "+":
               cal=new CalculatorAdd();
               break;
         
       case "-":
             cal=new CalculatorMinus();
             break;
             
             
       case "*":
             cal=new CalculatorMultiply();
             break;
             
       case "/":
             cal=new CalculatorDivide();
             break;
       }
       return cal;
    }
}
package com.dp.simpleFactory;

import java.util.Scanner;
/**
 * 客户端
 * 
 *
 */
public class Client {
   public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        System.out.println("请输入数字A");
        String numberA=in.next();
        System.out.println("请输入运算符号(ex:+ - * /)");
        String operate=in.next();
        System.out.println("请输入数字B");
        String numberB=in.next();
    //根据输入的符号得到具体的实现子类 使用到多态
        Calculator cal=CalculatorFactory.createCalculator(operate);
        cal.setNumberA(Double.parseDouble(numberA));
        cal.setNumberB(Double.parseDouble(numberB));
        double result=0;
        
        try {
            result = cal.getResult();
        } catch (Exception e) {
            System.out.println("除数不能为0");
        }
        System.out.println(result);
    
   }
}

 

UML类图:

    

书中给的一些关于UML图的用法:

  技术分享

  

     在core java一书中作者说到类之间的关系只有三种,一种是关联(has a ) 一种是依赖(use a) 一种是继承(is a) 但是这样分可能在UML中还难以表达。

我想既然是面向对象那么只用三种方式描述是不够严谨的,UML表示类之间的关系更能表达现实生活中类之间的关系。

     

  继承和实现就不说了 两者没什么区别

 

关联

  企鹅和气候是一种关联关系,企鹅需要了解天气是怎么样的,根据天气作出他们的行为(就好像人和天气是关联的,我们要知道天气怎么样)

   技术分享

聚合

  一种弱的拥有关系,比如雁群中有大雁,但某一只大雁可以不在雁群中。

技术分享

 

组合

  一种强的又有关系,比如头是一个类,那么嘴巴 耳朵和头都是组合的关系,无法分离

技术分享

 依赖   动物新陈代谢依赖于氧气和水,没有氧气和水,动物就会死亡

  技术分享

 

      

 

大话设计模式第一章之简单工厂模式