• 设计模式——简单工厂模式(SimpleFactory Pattern)


      最近做项目总是遇到这样或者那样的问题,代码不够简洁,代码可扩展性不够好,耦合度又太高了,导致经常有种想去重构又无从下手的感觉。

    无意间翻出了之前买的一本书《大话设计模式》读了一遍,受益匪浅,决定将其中的代码用java来实现一遍,个中精髓自行体会,

    此处只做代码的具体实现。^-^

      UML图:

      

      模型:

      产品基类:Product  

    package com.cnblog.clarck;
    
    /**
     * 产品类
     * 
     * @author clarck
     * 
     */
    public class Product {
        /**
         * 创建产品
         * 
         * @return
         */
        public String createRealProduct() {
            String product = "";
            return product;
        }
    }

      产品A的实例:ProductA

      

    package com.cnblog.clarck;
    
    /**
     * 产品A
     * 
     * @author clarck
     * 
     */
    public class ProductA extends Product {
    
        @Override
        public String createRealProduct() {
            String productA = "产品A";
            return productA;
        }
    
    }

      产品B的实例:ProductB

    package com.cnblog.clarck;
    
    /**
     * 产品B
     * 
     * @author clarck
     * 
     */
    public class ProductB extends Product {
    
        @Override
        public String createRealProduct() {
            String productB = "产品B";
            return productB;
        }
    
    }

      简单工厂类:ProductFactory

    package com.cnblog.clarck;
    
    /**
     * 产品工厂
     * 
     * @author clarck
     * 
     */
    public class ProductFactory {
        public static Product createProduct(ProductType type) {
            Product product = null;
            switch (type) {
            case PRODUCTA:
                product = new ProductA();
                break;
    
            case PRODUCTB:
                product = new ProductB();
                break;
    
            default:
                break;
            }
            return product;
        }
    }

      产品类型:ProductType 

    package com.cnblog.clarck;
    
    /**
     * 产品A,产品B的类型
     * 
     * @author clarck
     * 
     */
    public enum ProductType {
        PRODUCTA, PRODUCTB
    }

      测试类:Test

    package com.cnblog.clarck;
    
    /**
     * 测试用例
     * 
     * @author clarck
     * 
     */
    public class Test {
        public static void main(String[] args) {
            Product product = ProductFactory.createProduct(ProductType.PRODUCTA);
            String productA = product.createRealProduct();
            System.out.println(productA);
    
            product = ProductFactory.createProduct(ProductType.PRODUCTA);
            String productB = product.createRealProduct();
            System.out.println(productB);
        }
    }

      实例运用:

      ---------------------------------------------------------------------------------------

      数据运算基类:Operation

    package com.cnblog.clarck;
    
    /**
     * 数据运算基类
     * 
     * @author clarck
     * 
     */
    public class Operation {
        private double mNmberA = 0;
        private double mNumberB = 0;
    
        public double getNumberA() {
            return mNmberA;
        }
    
        public void setNmberA(double numberA) {
            this.mNmberA = numberA;
        }
    
        public double getNumberB() {
            return mNumberB;
        }
    
        public void setNumberB(double numberB) {
            this.mNumberB = numberB;
        }
        
        /**
         * 获取运算结果
         * @return
         */
        public double getResult() {
            double result = 0;
            return result;
        }
    
    }

     加法类:OperationAdd

    package com.cnblog.clarck;
    
    /**
     * 加法类
     * 
     * @author clarck
     * 
     */
    public class OperationAdd extends Operation {
    
        @Override
        public double getResult() {
            double result = 0;
            result = getNumberA() + getNumberB();
            return result;
        }
    
    }

    减法运算类:OperationSub

    package com.cnblog.clarck;
    
    /**
     * 减法类
     * 
     * @author clarck
     * 
     */
    public class OperationSub extends Operation {
    
        @Override
        public double getResult() {
            double result = getNumberA() - getNumberB();
            return result;
        }
    
    }

    乘法运算类:OperationMul

    package com.cnblog.clarck;
    
    /**
     * 乘法
     * 
     * @author clarck
     * 
     */
    public class OperationMul extends Operation {
    
        @Override
        public double getResult() {
            double result = getNumberA() * getNumberB();
            return result;
        }
    
    }

    除法类:OperationDiv

    package com.cnblog.clarck;
    
    /**
     * 除法类
     * 
     * @author clarck
     * 
     */
    public class OperationDiv extends Operation {
    
        @Override
        public double getResult() {
            if (getNumberB() == 0) {
                throwException();
            }
    
            double result = getNumberA() / getNumberB();
            return result;
        }
    
        private void throwException() {
            try {
                throw new Exception("除数不能为0.");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    简单工厂类:OperationFactory

    package com.cnblog.clarck;
    
    /**
     * 工厂类
     * 
     * @author clarck
     * 
     */
    public class OperationFactory {
        /**
         * 创建运算类的工厂
         * 
         * @param operate
         *            运算类对象
         * @return 
         *             创建成功-运算类对象,返回空
         */
        public static Operation createOperation(OperationSymbol operate) {
            Operation oper = null;
            switch (operate) {
            case ADDITION:
                oper = new OperationAdd();
                break;
    
            case SUBTRACTION:
                oper = new OperationSub();
                break;
    
            case MULTIPLICATION:
                oper = new OperationMul();
                break;
    
            case DIVISION:
                oper = new OperationDiv();
                break;
    
            default:
                break;
            }
            return oper;
        }
    }

    运算符号类:OperationSymbol

    package com.cnblog.clarck;
    
    /**
     * 加法, 减法, 乘法, 除法
     * 
     * @author clarck
     * 
     */
    public enum OperationSymbol {
        ADDITION, SUBTRACTION, MULTIPLICATION, DIVISION
    }

    测试类:Test

    package com.cnblog.clarck;
    
    /**
     * 测试类
     * 
     * @author clarck
     * 
     */
    public class Test {
        public static void main(String[] args) {
            Operation oper = null;
            oper = OperationFactory.createOperation(OperationSymbol.ADDITION);
            oper.setNmberA(1.0);
            oper.setNumberB(2.0);
            double addResult = oper.getResult();
            System.out.println("addResult =" + addResult);
            
            oper = OperationFactory.createOperation(OperationSymbol.SUBTRACTION);
            oper.setNmberA(1.0);
            oper.setNumberB(2.0);
            double subResult = oper.getResult();
            System.out.println("subResult =" + subResult);
            
            oper = OperationFactory.createOperation(OperationSymbol.MULTIPLICATION);
            oper.setNmberA(1.0);
            oper.setNumberB(2.0);
            double mulResult = oper.getResult();
            System.out.println("mulResult =" + mulResult);
            
            oper = OperationFactory.createOperation(OperationSymbol.DIVISION);
            oper.setNmberA(1.0);
            oper.setNumberB(2.0);
            double divResult = oper.getResult();
            System.out.println("divResult =" + divResult);
        }
    }

      

  • 相关阅读:
    爬虫介绍
    HTTP请求协议
    谷歌浏览器表单提交,input填充背景
    SVN与GIT基础知识学习
    vue 开发环境搭建
    正则表达式验证
    canvas基础
    数组基础方法应用
    AJAX基础学习
    css弹性布局 --flex布局。
  • 原文地址:https://www.cnblogs.com/tanlon/p/3381689.html
Copyright © 2020-2023  润新知