ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

大话设计模式读书笔记系列-5.工厂方法

2019-09-20 20:00:54  阅读:257  来源: 互联网

标签:oper return 读书笔记 double 大话 工厂 Operation 设计模式 public


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

工厂方法

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

场景:

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

 

 

计算器运算抽象类
/**
 * 计算器运算抽象类
 */
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

 

解析

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

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

 

标签:oper,return,读书笔记,double,大话,工厂,Operation,设计模式,public
来源: https://www.cnblogs.com/ff111/p/11559472.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有