1.簡單工廠模式概述:
簡單工廠模式又叫靜態工廠方法模式,屬於類的創建型模式,但不屬於23種GOF設計模式之一。通過專門定義一個類負責創建其他類的實例,被創建的實通常具有共同的父類。。
2.簡單工廠模式包含的角色及其職責:
(1)工廠角色[Creator]:簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類的創建產品類的方法可以被外界直接調用,創建所需的產品對象。
(2)抽象產品角色[Product]:簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
(3)具體產品角色[Concrete Product]:簡單工廠模式所創建的具體實例對象。
3.簡單工廠模式的實現方式及UML類圖:
(1)實現方式:簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。
(2)UML類圖:
4.Java案例代碼:
(1)抽象產品角色(產品有哪些特點):
package SimpleFactoryModel; /** * 運算類 */ public abstract class Operation { private double number1; private double number2; public double getNumber1() { return number1; } public void setNumber1(double number1) { this.number1 = number1; } public double getNumber2() { return number2; } public void setNumber2(double number2) { this.number2 = number2; } public abstract Double getResult() throws Exception; }
(2)具體產品角色(產品的特點能干什么):
package SimpleFactoryModel; /** * 加法運算類,繼承運算類 */ public class OperationAdd extends Operation { @Override public Double getResult() { //super.getNumber1()+super.getNumber2(); return getNumber1()+getNumber2(); } } package SimpleFactoryModel; /** * 減法運算類,繼承運算類 */ public class OperationSub extends Operation { @Override public Double getResult() { //super.getNumber1()+super.getNumber2(); return getNumber1()-getNumber2(); } } package SimpleFactoryModel; /** * 乘法運算類,繼承運算類 */ public class OperationMul extends Operation { @Override public Double getResult() { //super.getNumber1()+super.getNumber2(); return getNumber1()*getNumber2(); } } package SimpleFactoryModel; /** * 除法運算類,繼承運算類 */ public class OperationDiv extends Operation { @Override public Double getResult() throws Exception { if (getNumber2()==0) { throw new ArithmeticException("除數不能為'0'!"); } //super.getNumber1()+super.getNumber2(); return getNumber1()/getNumber2(); } }
(3)工廠角色(能根據業務動態的選擇生產哪些產品):
package SimpleFactoryModel; /** * 簡單運算工廠類 */ public class OperationFactory { public static Operation oper = null; public static Operation createOperation(String operator) { //根據傳入的運算符生產出相對應的運算對象 switch (operator) { case "+": oper=new OperationAdd(); break; case "-": oper=new OperationSub(); break; case "*": oper=new OperationMul(); break; case "/": oper=new OperationDiv(); break; default: break; } return oper; } }
(4)客戶端測試代碼:
package SimpleFactoryModel; /** * 客戶端測試代碼 */ public class Test { public static void main(String[] args) throws Exception { //加法 Addpend(1,1); //減法 Subtract(1,1); //乘法 Multiply(1,1); //除法 Divide(1,1); } public static void Addpend(double number1,double number2) throws Exception { String add = "+"; Operation Add = OperationFactory.createOperation(add);//使用工程去創建出來一個產品 Add.setNumber1(number1); Add.setNumber2(number2); Double result = Add.getResult();//通過該產品做某些事 System.out.println("加法:"+result); } public static void Subtract(double number1,double number2) throws Exception { String sub = "-"; Operation Sub = OperationFactory.createOperation(sub); Sub.setNumber1(number1); Sub.setNumber2(number2); Double result = Sub.getResult(); System.out.println("減法:"+result); } public static void Multiply(double number1,double number2) throws Exception { String mul = "*"; Operation Mul = OperationFactory.createOperation(mul); Mul.setNumber1(number1); Mul.setNumber2(number2); Double result = Mul.getResult(); System.out.println("乘法:"+result); } public static void Divide(double number1,double number2) throws Exception { String div = "/"; Operation Div = OperationFactory.createOperation(div); Div.setNumber1(number1); Div.setNumber2(number2); Double result = Div.getResult(); System.out.println("除法:"+result); } }
(5)客戶端測試代碼打印結果:
5.簡單工廠模式的優缺點及使用場景:
(1)優點:工廠類是整個模式的關鍵,包含了必要的邏輯判斷,根據外界給定的信息,決定究竟應該創建哪個具體類的對象。用戶在使用時可以直接根據工廠類去創建所需的實例,而無需了解這些
對象是如何創建以及如何組織的。明確了各自的職責和權利,有利於整個軟件體系結構的優化。
(2)缺點:簡單工廠模式的缺點也正體現在其工廠類上,由於工廠類集中了所有實例的創建邏輯,所以“高內聚”方面做的並不好。另外,當系統中的具體產品類不斷增多時,可能會出現要求工廠類也要做相應的修改,擴展性並不很好。。
(3)使用場景:①工廠類負責創建的對象比較少;
②客戶只知道傳入工廠類的參數,對於如何創建對象(邏輯)不關心;
由於簡單工廠很容易違反高內聚責任分配原則,因此我們一般只在很簡單的情況下會去應用它。
————————————————
版權聲明:本文為CSDN博主「LRB_Len」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_39588630/java/article/details/80423528