Simple Factory Pattern簡單工廠模式

一.簡介

使用繼承和多型將要使用同一個方法的類別們分開封裝,並以工廠決定要實體化哪個物件執行該方法。優點:根據條件動態實體化需要的類別,缺點:違背開放封閉原則,因為新增一個類別時需要動到工廠類別裡的方法。

二.Simple Factory Pattern的組成

1.利用多型的子類別們
2.一個工廠,含有回傳需要的父類別的方法,在呼叫該方法時決定回傳的是哪個子類別的實體

三.實作

enum OperationError:Error {
    case div0Problem
}
class Operation{//父類別-運算
//擁有兩個變數num1,num2及對num1,num2做運算的方法
    private var _num1:Double = 0.0;
    private var _num2:Double = 0.0;
    var num1:Double{
        set(original){
            self._num1 = original;
        }
        get{
            return self._num1;
        }
    }
    var num2:Double{
        set(original){
            self._num2 = original;
        }
        get{
            return self._num2;
        }
    }
    func  operation()throws->Double{return 0.0};//運算方法
}
class OperationAdd: Operation {//子類別-加法運算
    override func operation()->Double {
        return num1+num2;
    }
}
class OperationSub: Operation {//子類別-減法運算
    override func operation() -> Double {
        return num1-num2;
    }
}
class OperationMul: Operation {//子類別-乘法運算
    override func operation() -> Double {
        return num1*num2;
    }
}
class OperationDiv:Operation{//子類別-除法運算
//利用例外處理除數為0的情況
    override func operation()throws -> Double {
        if(num2==0){
            throw OperationError.div0Problem;
        }
        return num1/num2;
    }
    func test()throws{
        try operation();
    }
}

class OperationFactory{//運算工廠
    func createOperation(_ type:String)->Operation{//製造運算的function
        switch type {
        case "+":
            return OperationAdd();
        case "-":
            return OperationSub();
        case "*":
            return OperationMul();
        case "/":
            return OperationDiv();
        default:
            return Operation();
        }
    }
}
var operation:Operation?;
operation = OperationFactory().createOperation("/")//呼叫方法時決定呼叫的是哪種運算
operation?.num1 = 2.8;
operation?.num2 = 1.4;
do {//處理例外拋出時該做什麼
    var result:Double?;
    result = try operation?.operation();
    print(result!);
}
catch OperationError.div0Problem {
        print("除數不得為0")
}
catch {
    print("例外")
}

四.參考資料

大話設計模式