《設計模式》--簡單工廠模式

簡單工廠模式(靜態工廠)

認識

在工廠類中提高一個工廠方法,根據參數類型實例化不同的對象返回給客戶端

思考

  • 定義:提供一個創建對象實例的功能,無須關心細節和具體實現。

  • 面向接口編程,只知道接口,不知道實現類

  • 本質是:選擇實現

使用場景

  1. 當需要封裝實現細節,外部不知道具體實現只能通過接口來操作封裝體的時候,可以選擇簡單工廠,讓客戶端通過簡單工廠提供的方法獲取相應的接口實現。
  2. 當想要把創建對象的職責、權限集中在內部管理和控制時,選擇簡單工廠,例如簡單工廠加單例模式控制創建對象。

優缺點

  • 優點

    1. 封裝實現細節
    2. 解耦
  • 缺點

    1. 增加客戶端複雜度
    2. 不方便擴展子工廠

UML圖

客戶端只能夠訪問接口和工廠類,具體實現細節對客戶端透明,工廠方法一般都是靜態的,根據客戶端調用傳入的參數去實例化不同的實現類對象。

image

代碼實現

在工廠方法中也可以通過讀取外部配置文件中的class name進行反射創建對象,實現可配置。例如將數據庫驅動的class 配置在外部properties中,在工廠方法中讀取到驅動類反射創建,之後想更改驅動的時候直接更改配置文件即可。

/**
 * 靜態工廠
 */
public class Factory {
    public static IOperate createClass(String regix){
        IOperate operate =null;
        char myRegix = regix.charAt(0);
        switch(myRegix){
        case '+' :
            operate = new Add();
            break;
        case '-' :
            operate = new Sub();
            break;
        case '*' :
            operate = new Mul();
            break;
        case '/' :
            operate = new Div();
            break;
        default :
            throw new RuntimeException("你輸出的運算符不符合該計算器");
        }
        return  operate;
    }
    public Factory() {
    }
}
/**
 * 接口
 *
 */
public interface IOperate {
    public double firstNum = 0;
    public double secondNum = 0;
    public double getResult(double firstNum,double secondNum);
}
/**
 *實現類
 */
class Add implements IOperate{

    public double getResult(double firstNum, double secondNum) {
        double result = firstNum + secondNum;
        return result;
    }

}
class Sub implements IOperate{

    public double getResult(double firstNum, double secondNum) {
        double result = firstNum - secondNum;
        return result;
    }


}
class Mul implements IOperate{

    public double getResult(double firstNum, double secondNum) {
        double result = firstNum * secondNum;
        return result;
    }

}
class Div implements IOperate{

    public double getResult(double firstNum, double secondNum) {
        if(secondNum == 0){
            throw new RuntimeException("被除數不能爲0");
        }
        double result = firstNum / secondNum;
        return result;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章