本篇文章主要講解工廠方法模式。工廠方法模式:定義一個用於建立對象的接口,讓子類去決定實例化哪個類。工廠方法使一個類的實例化延遲到其子類。git
在看工廠方法模式以前先寫個簡單的計算器看下簡單工廠。github
先看下結構圖。ide
接着看下代碼實現。測試
首先建立一個運算抽象類。spa
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: 運算抽象類 * User: lwx * Date: 2019-03-09 * Time: 20:45 */ public abstract class Operation { double numberA = 0; double numberB = 0; abstract double getResult(); }
而後是四種運算的實現類。code
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: 加法實現類 * User: lwx * Date: 2019-03-09 * Time: 20:47 */ public class OperationAdd extends Operation { double getResult() { return numberA + numberB; } }
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: 減法實現類 * User: lwx * Date: 2019-03-09 * Time: 20:48 */ public class OperationSub extends Operation { double getResult() { return numberA - numberB; } }
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: 乘法實現類 * User: lwx * Date: 2019-03-09 * Time: 20:49 */ public class OperationMul extends Operation { double getResult() { return numberA * numberB; } }
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: 除法實現類 * User: lwx * Date: 2019-03-09 * Time: 20:51 */ public class OperationDiv extends Operation { double getResult() { if (numberB == 0){ throw new ArithmeticException("除數不能爲0"); } return numberA / numberB; } }
接着建立運算工廠類,根據運算符去建立對應的實現類。對象
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: 運算工廠類 * User: lwx * Date: 2019-03-09 * Time: 21:06 */ public class OperationFactory { public static Operation createOperation(String operate) { Operation operation = null; switch (operate) { case "+": operation = new OperationAdd(); break; case "-": operation = new OperationSub(); break; case "*": operation = new OperationMul(); break; case "/": operation = new OperationDiv(); break; } return operation; } }
最後是測試類和測試結果。blog
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-09 * Time: 20:59 */ public class OperationTest { public static void main(String[] args) { Operation operation = OperationFactory.createOperation("+"); operation.numberA = 5; operation.numberB = 10; System.out.println(operation.getResult()); } }
以上就是簡單工廠的示例代碼,只須要傳入運算符號工廠類就能夠自動返回對應的計算實現類。 接口
接下來把上面的計算器改爲工廠方法模式。ip
老規矩先看下結構圖。
在上面代碼的基礎上加入工廠接口類以及具體實現類,上面的運算工廠類就不用了。
先建立一個工廠接口。
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: 工廠接口 * User: lwx * Date: 2019-03-09 * Time: 21:15 */ public interface Factory { Operation createOperation(); }
而後是四種運算的具體實現工廠類。
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: 加法類工廠 * User: lwx * Date: 2019-03-09 * Time: 21:16 */ public class AddFactory implements Factory { @Override public Operation createOperation() { return new OperationAdd(); } }
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: 減法工廠類 * User: lwx * Date: 2019-03-09 * Time: 21:17 */ public class SubFactory implements Factory { @Override public Operation createOperation() { return new OperationSub(); } }
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: 乘法工廠類 * User: lwx * Date: 2019-03-09 * Time: 21:18 */ public class MulFactory implements Factory { @Override public Operation createOperation() { return new OperationMul(); } }
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: 除法工廠類 * User: lwx * Date: 2019-03-09 * Time: 21:19 */ public class DivFactory implements Factory { @Override public Operation createOperation() { return new OperationDiv(); } }
最後看下工廠方法模式的測試類和運行結果。
package com.lwx.factory; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-09 * Time: 21:58 */ public class FactoryTest { public static void main(String[] args) { Factory factory = new DivFactory(); Operation operation = factory.createOperation(); operation.numberA = 8; operation.numberB = 10; System.out.println(operation.getResult()); } }
簡單工廠模式的優缺點:
優勢:
1.簡單工廠包含必要的邏輯判斷,簡單工廠實現了對象的建立和使用的分離。
2.客戶端無需知道所建立的集體產品類的類名,只須要知道具體產品類對應的參數便可。
3.在不修改客戶端代碼的狀況下更換和增長新的具體產品類,在必定程度上提升了系統的靈活性。
缺點:
1.工廠類職責太重,從代碼中能夠看出簡單工廠包含加減乘除的邏輯判斷語句,它一旦有問題,整個系統都要出問題。
2.再添加新類的時候,簡單工廠類就要修改,違反了開放———封閉原則,這樣不利於系統的擴展和維護。
因此出現了工廠方法,工廠方法是簡單工廠的進一步延伸,完美解決了開放——封閉原則的問題。
工廠方法模式的優缺點:
優勢:
1.工廠方法用來建立客戶所需的產品,同時隱藏了哪一種具體產品類被實例化的細節,用戶只須要關注工廠,不須要關注建立的細節。
2.在增長新的運算類時不用修改代碼,只須要增長對應的工廠就好,徹底符合開放——封閉原則。
缺點:
1.在增長新的產品時,也必須增長新的工廠類,會帶來額外的開銷。
倆個工廠各有利弊,簡單工廠違反了最基本的原則,工廠方法完美解決了簡單工廠的弊端,可是工廠方法的工廠個數過多,致使系統龐大。
最後附上demo的githup地址:https://github.com/yijinqincai/design_patterns