簡單工廠模式及其簡單Java案例代碼實現


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM