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("例外")
}
四.參考資料
大話設計模式