大话设计模式读书笔记系列-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

解析

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

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

原文地址:https://www.cnblogs.com/ff111/p/11559472.html