简单工厂模式--------简单分析

  买了一本大话设计模式,开始我的设计模式之旅,可能是自己的技术不够,还是不怎么理解,写下来留纪念,有啥不正确的,望批评指正。

  简单工厂模式,具体什么定义,网上有很多的版本了,自己可以百度一下。我就是按照自己的理解,工厂嘛,就是生产东西的,生产什么领导告诉就好了。Java的简单工厂,就是生产类(其他用途自己理解吧),根据不同参数创建不同的实例。

  三个方面:

    1.一个抽象类或者接口,(我这边用的是抽象类,里面声明了属性,如果用接口的话,属性值无法改变,如果只有方法,可以选择接口)

    2.具体对象,实现类,具体的业务操作,继承或者实现抽象类或者接口

    3. 工厂类,提供公共的方法,根据不同参数,返回具体类的对象

  举个生活方面的例子,去奶茶店买饮品,你需要告诉服务员(相当于工厂类)你要饮料(抽象类或者接口),哪种饮料呢,总要有个标志呀,比如珍珠奶茶,珍珠奶绿(相当于参数),你不用关心具体他她给你添加什么水,什么颜料,只要他给你需要的奶茶,奶绿(相当于具体对象)就行了。

  好吧,直接上代码,例子是一个简单的加减运算。

  抽象类

  

package com.wqq.design.simplefactory;

/** 
 * @author wangqq 
 * @version 创建时间:2018年7月23日 上午10:58:42 
 * 抽象接口,定义一些抽象方法,用以子类实现
 */
public abstract class Operation {
     double number1;
     double number2;
     /**
      * private double number1;
      * 声明私有的时候,要对外部提供get,set方法
      */
    
    /**
     * 每个运算都是为了得到结果
     * @return
     */
    public abstract double getResult();
}

  加法

package com.wqq.design.simplefactory;

/** 
 * @author wangqq 
 * @version 创建时间:2018年7月23日 上午11:02:17 
 * 加法运算
 */
public class AddOperation extends Operation {
    /**
     * 子类再次声明参数时,测试时候无法取到值,这里牵扯到继承相关的知识点
     * 
    */
   double number1;
    double number2;

  @Override
  public double getResult() { 

    return number1+number2;
  } }

  减法

package com.wqq.design.simplefactory;

/** 
 * @author wangqq 
 * @version 创建时间:2018年7月23日 上午11:05:48 
 * 减法运算
 */
public class SubtractionOperation extends Operation {
    
    @Override
    public double getResult() {
        return number1-number2;
    }

}

 

  工厂类

package com.wqq.design.simplefactory;

/** 
 * @author wangqq 
 * @version 创建时间:2018年7月23日 上午11:08:38 
 * 工厂方法
 */
public class SimpleFactory {
    /**
     * 根据参数创建不同对象
     * @param sign
     * @return
     * @throws Exception
     */
    public static Operation createOperation(String sign) throws Exception{
        
        if (null==sign || "".equals(sign)){
            throw new Exception("运算符为空或不正确");
        }
        
        /*if ("+".equals(sign.trim())){
            return new AddOperation();
        }
        
        if ("-".equals(sign.trim())){
            return new SubtractionOperation();
        }*/
        Operation operation = null;
        
        switch (sign.trim()) {
        
        case "+":
            operation = new AddOperation();
            break;
            
        case "-":
            operation = new SubtractionOperation();
            break;
            
        default:
            break;
        }
        
        return operation;
    }
}

 

  测试代码

package com.wqq.design.simplefactory;
/** 
 * @author wangqq 
 * @version 创建时间:2018年7月23日 上午11:07:06 
 * 类说明 
 */
public class TestSimpleFactory {
    
    public static void main(String[] args){
        Operation operation;
        try {
            operation=SimpleFactory.createOperation("+");//向上造型
            operation.number1=5;
            operation.number2=6;
            double result=operation.getResult();
            System.out.println(result);
            
            operation=SimpleFactory.createOperation("-");
            operation.number1=10;
            operation.number2=6;
            System.out.println(operation.getResult());
            
            /*
            AddOperation addOperation=new AddOperation();
            addOperation.number1=1;
            addOperation.number2=2;
            System.out.println(addOperation.getResult());    */    
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}

  结果:

如果子类有相同的属性名称,不会在调用父类的属性值,

operation=SimpleFactory.createOperation("+");
operation.number1=5;
operation.number2=6;
这个是赋值给父类的属性,子类重写了属性,所以最后的输出是0.0 (如果解释有误的,望指正)

   修改加法

 

package com.wqq.design.simplefactory;

/** 
 * @author wangqq 
 * @version 创建时间:2018年7月23日 上午11:02:17 
 * 加法运算
 */
public class AddOperation extends Operation {
    /**
     * 子类再次声明参数时,测试时候无法取到值
     * double number1;
     * double number2;
    */
    
    @Override
    public double getResult() {
        return number1+number2;
    }

}

结果

 好了,到此,算是简单理解了一下简单工厂模式

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/Cassie-wang/p/9354565.html