zoukankan      html  css  js  c++  java
  • 设计模式——工厂模式(Factory Method)

      工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。

    UML图:

      运算基类:

      

    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;
        }
    
    }

      

      具体产品类:

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

      

    package com.cnblog.clarck;
    
    /**
     * 减法类
     * 
     * @author clarck
     * 
     */
    public class OperationSub extends Operation {
    
        @Override
        public double getResult() {
            double result = getNumberA() - getNumberB();
            return result;
        }
    
    }
    package com.cnblog.clarck;
    
    /**
     * 乘法
     * 
     * @author clarck
     * 
     */
    public class OperationMul extends Operation {
    
        @Override
        public double getResult() {
            double result = getNumberA() * getNumberB();
            return result;
        }
    
    }
    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("the div number can't be zero.");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

      工厂类接口:

    package com.cnblog.clarck;
    
    /**
     * 算法工厂
     * 
     * @author clarck
     * 
     */
    public interface IFactory {
        public Operation createOperation();
    }

      工厂类:

    package com.cnblog.clarck;
    
    /**
     * 加法工厂
     * 
     * @author clarck
     * 
     */
    public class AddFactory implements IFactory {
    
        @Override
        public Operation createOperation() {
            return new OperationAdd();
        }
    
    }
    package com.cnblog.clarck;
    
    /**
     * 减法工厂
     * 
     * @author clarck
     * 
     */
    public class SubFactory implements IFactory {
    
        @Override
        public Operation createOperation() {
            return new OperationSub();
        }
    
    }
    package com.cnblog.clarck;
    
    /**
     * 乘法
     * 
     * @author clarck
     * 
     */
    public class MulFactory implements IFactory {
    
        @Override
        public Operation createOperation() {
            return new OperationMul();
        }
    
    }
    package com.cnblog.clarck;
    
    /**
     * 除法工厂
     * 
     * @author clarck
     * 
     */
    public class DivFactory implements IFactory {
    
        @Override
        public Operation createOperation() {
            return new OperationDiv();
        }
    
    }

      运算符号类:

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

      测试类:

    package com.cnblog.clarck;
    
    /**
     * 测试类
     * 
     * @author clarck
     * 
     */
    public class Client {
        public static void main(String[] args) {
            IFactory operFactory = new AddFactory();
            Operation operation = operFactory.createOperation();
            operation.setNmberA(1);
            operation.setNumberB(2);
            double result = operation.getResult();
            System.out.println("add result: " + result);
    
            operFactory = new SubFactory();
            Operation subOperation = operFactory.createOperation();
            subOperation.setNmberA(1);
            subOperation.setNumberB(2);
            double subResult = subOperation.getResult();
            System.out.println("sub result: " + subResult);
    
            operFactory = new MulFactory();
            Operation mulOperation = operFactory.createOperation();
            mulOperation.setNmberA(1);
            mulOperation.setNumberB(2);
            double mulResult = mulOperation.getResult();
            System.out.println("mul result: " + mulResult);
    
            operFactory = new DivFactory();
            Operation divOperation = operFactory.createOperation();
            divOperation.setNmberA(1);
            divOperation.setNumberB(2);
            double divResult = divOperation.getResult();
            System.out.println("div result: " + divResult);
    
        }
    }
  • 相关阅读:
    分布式事务-第一刀
    Qt
    自描述C++部分面试题集
    读书笔记6.21
    STL vector容器 和deque容器
    C++ STL框架
    C++ 多态
    C++ 虚继承
    C++ 类的继承和派生
    C++ 类中的函数重载
  • 原文地址:https://www.cnblogs.com/tanlon/p/3391163.html
Copyright © 2011-2022 走看看