zoukankan      html  css  js  c++  java
  • 简单工厂模式--------简单分析

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

      简单工厂模式,具体什么定义,网上有很多的版本了,自己可以百度一下。我就是按照自己的理解,工厂嘛,就是生产东西的,生产什么领导告诉就好了。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;
        }
    
    }

    结果

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

     

     

     

     

     

     

  • 相关阅读:
    HDU2546(01背包)
    HDU4283(KB22-G)
    POJ1651(KB-E)
    POJ2955(KB22-C 区间DP)
    POJ3264(KB7-G RMQ)
    POJ3468(KB7-C 线段树)
    POJ3616(KB12-R dp)
    Ubuntu16.04安装opencv for python/c++
    华中农业大学第五届程序设计大赛网络同步赛-L
    华中农业大学第五届程序设计大赛网络同步赛-K
  • 原文地址:https://www.cnblogs.com/Cassie-wang/p/9354565.html
Copyright © 2011-2022 走看看