一、思想圖
二、相比簡單工廠模式,實現了代碼的開閉原則。即原來在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()); } }