工厂方法html
定义一个用于建立对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。设计模式
场景:ide
经过计算器(加减乘除)来说解工厂方式post
计算器运算抽象类
/** * 计算器运算抽象类 */ 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(); } }
调用this
/** * 部分代码参照简单工厂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)); } }
结果url
加法计算结果:3.0 乘法计算结果:2.0 除法计算结果:0.5 减法计算结果:-1.0
解析spa
简单工厂模式的最大优势在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来讲,去除了与具体产品的依赖.设计
工厂方法模式实现时,客户端须要决定实例化哪个工厂来实现运算类,选择判断的问题仍是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,你想要加功能,原本是改工厂类的,而如今是修改客户端.3d