一、思想图
二、相比简单工厂模式,实现了代码的开闭原则。即原来在switch里每增加一个功能,就写一个case,制造对象,而现在新增功能直接写一个方法即可。
三、代码
3.1抽取共同信息
package com.xx.bean; /** * 工厂方法模式——父类(抽取固定模块) * @author phoebe * */ public class CaculateBean { private double a; private double b; private double result; public double getA() { return a; } public void setA(double a) { this.a = a; } public double getB() { return b; } public void setB(double b) { this.b = b; } public double getResult() { return result; } public void setResult(double result) { this.result = result; } }
3.2加法实现类/其他类类似
package com.xx.function; import com.xx.bean.CaculateBean; /** * 加法类 * @author phoebe * */ public class Caculate_AddImpl extends CaculateBean{ @Override public double getResult() { return this.getA()+this.getB(); } }
3.3算数对象工厂
package com.xx.factory; import com.xx.bean.CaculateBean; import com.xx.function.Caculate_AddImpl; import com.xx.function.Caculate_DivImpl; import com.xx.function.Caculate_MultiImpl; import com.xx.function.Caculate_SubImpl; /** * 算数对象工厂,新增功能时直接新增方法,方法和方法是隔离的,避免了修改原则 * @author phoebe * */ public class BeanFactory{ //制造加法对象 public CaculateBean createAddBean() { return new Caculate_AddImpl(); } //制造减法对象 public CaculateBean createSubBean() { return new Caculate_SubImpl(); } //制造减法对象 public CaculateBean createMultiBean() { return new Caculate_MultiImpl(); } //制造减法对象 public CaculateBean createDivBean() { return new Caculate_DivImpl(); } }
3.4测试
package com.xx.test; import com.xx.bean.CaculateBean; import com.xx.factory.BeanFactory; /** * 测试类 * @author phoebe * */ public class Caculate_Factory_method { public static void main(String[] args) { CaculateBean addBean = new BeanFactory().createAddBean(); addBean.setA(1); addBean.setB(2); System.out.println(addBean.getResult()); } }
Best Regards