zoukankan      html  css  js  c++  java
  • 大话设计模式读书笔记系列-5.工厂方法

    >>>大话设计模式读书笔记系列目录>>>

    工厂方法

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

    场景:

    通过计算器(加减乘除)来讲解工厂方式

    计算器运算抽象类
    /**
     * 计算器运算抽象类
     */
    public abstract class Operation {
        /**
         * 操作数A
         */
        private double numberA;
        /**
         * 操作数B
         */
        private double numberB;
    
        /**
         * 抽象方法
         * 获得操作结果
         *
         * @return
         */
        public abstract double getResult();
    
        /**
         * 获取 操作数A
         *
         * @return numberA 操作数A
         */
        public double getNumberA() {
            return this.numberA;
        }
    
        /**
         * 设置 操作数A
         *
         * @param numberA 操作数A
         */
        public void setNumberA(double numberA) {
            this.numberA = numberA;
        }
    
        /**
         * 获取 操作数B
         *
         * @return numberB 操作数B
         */
        public double getNumberB() {
            return this.numberB;
        }
    
        /**
         * 设置 操作数B
         *
         * @param numberB 操作数B
         */
        public void setNumberB(double numberB) {
            this.numberB = numberB;
        }
    
        @Override
        public String toString() {
            return "Operation{" +
                    "numberA=" + numberA +
                    ", numberB=" + numberB +
                    '}';
        }
    }
    加法运算类
    /**
     * 加法运算类
     */
    public class OperationAdd extends Operation {
    
        @Override
        public double getResult() {
            return super.getNumberA() + super.getNumberB();
        }
    }
    减法运算类
    /**
     * 减法运算类
     */
    public class OperationSub extends Operation {
        @Override
        public double getResult() {
            return super.getNumberA() - super.getNumberB();
        }
    }
    乘法运算类
    /**
     * 乘法运算类
     */
    public class OperationMul extends Operation {
        @Override
        public double getResult() {
            return super.getNumberA() * super.getNumberB();
        }
    }
    除法运算类
    /**
     * 除法运算类
     */
    public class OperationDiv extends Operation {
        @Override
        public double getResult() {
            return super.getNumberA() / super.getNumberB();
        }
    }
    工厂接口
    /**
     * 工厂接口
     */
    public interface IFactory {
        Operation createOperation();
    }
    加法工厂实现类
    /**
     * 加法工厂实现类
     */
    public class AddFactory implements IFactory {
        @Override
        public Operation createOperation() {
            return new OperationAdd();
        }
    }
    减法工厂实现类
    /**
     * 减法工厂实现类
     */
    public class SubFactory implements IFactory {
        @Override
        public Operation createOperation() {
            return new OperationSub();
        }
    }
    乘法工厂实现类
    /**
     * 乘法工厂实现类
     */
    public class MulFactory implements IFactory {
        @Override
        public Operation createOperation() {
            return new OperationMul();
        }
    }
    除法工厂实现类
    /**
     * 除法工厂实现类
     */
    public class DevFactory implements IFactory {
        @Override
        public Operation createOperation() {
            return new OperationDiv();
        }
    }

    调用

    /**
     * 部分代码参照简单工厂demo
     * 工厂模式
     */
    public class FactoryMethodDemo {
        public static void main(String[] args) {
            IFactory operFactory;
            Operation oper;
            double result;
            //创建加法工厂
            operFactory=new AddFactory();
            //获得加法运算器
            oper=operFactory.createOperation();
            oper.setNumberA(1);
            oper.setNumberB(2);
            //获得结果
            result=oper.getResult();
            System.out.println("加法计算结果:"+String.valueOf(result));
    
            //创建乘法工厂
            operFactory=new MulFactory();
            //获得加法运算器
            oper=operFactory.createOperation();
            oper.setNumberA(1);
            oper.setNumberB(2);
            //获得结果
            result=oper.getResult();
            System.out.println("乘法计算结果:"+String.valueOf(result));
    
            //创建除法工厂
            operFactory=new DevFactory();
            //获得加法运算器
            oper=operFactory.createOperation();
            oper.setNumberA(1);
            oper.setNumberB(2);
            //获得结果
            result=oper.getResult();
            System.out.println("除法计算结果:"+String.valueOf(result));
    
            //创建减法工厂
            operFactory=new SubFactory();
            //获得加法运算器
            oper=operFactory.createOperation();
            oper.setNumberA(1);
            oper.setNumberB(2);
            //获得结果
            result=oper.getResult();
            System.out.println("减法计算结果:"+String.valueOf(result));
    
        }
    }

    结果

    加法计算结果:3.0
    乘法计算结果:2.0
    除法计算结果:0.5
    减法计算结果:-1.0

    解析

    简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖.

    工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,你想要加功能,本来是改工厂类的,而现在是修改客户端.

  • 相关阅读:
    hust 1260 Dominos && hust 1516 Dominos
    poj 1149 PIGS
    hust 1230 beautiful
    poj 1469 COURSES
    hdu 3062 Party
    hust 1027 Enemy Target!
    hdu 3415 Max Sum of Max-K-sub-sequence
    简单的实现轮播代码
    window.parent与window.openner区别介绍
    plupload使用指南(转)
  • 原文地址:https://www.cnblogs.com/ff111/p/11559472.html
Copyright © 2011-2022 走看看