1、概念
定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法是乙個類的例項化延伸到子類。
2、背景
已經知道工廠模式,有乙個父類superclass,以及這個父類的不同實現方法和演算法的若干個子類classa,classb... ...,有乙個工廠類daofactory,根據客戶端傳來的標識決定呼叫哪個子類。如下:
[csharp]view plain
copy
print?
using
system;
using
system.collections.generic;
using
system.text;
namespace
factorypattern
public
class
classa:superclass
} public
class
classb : superclass
} public
class
daofactory
return
super;
} }
}
客戶端[csharp]view plain
copy
print?
using
system;
using
system.collections.generic;
using
system.text;
namespace
factorypattern
} }
結果可以看出,簡單工廠模式是把到底例項化哪個類的邏輯放在工廠裡判斷,客戶端不需要知道呼叫的哪個類,只關心結果就可以了。但是這裡有乙個問題,如果需求有了變化。那麼就要增加新的類classc,classd… … 增加類不影響程式是可行的,但工廠類中的switch分支要不斷地加,也就是要不斷修改daofactory類,不符合開放封閉原則(程式實體可以擴充套件,但不被修改)。那麼如何解決?
3、工廠方法模式
根據問題,可以有這樣的方案,類classc,classd照常增加,但是需要修改工廠類。
[csharp]view plain
copy
print?
using
system;
using
system.collections.generic;
using
system.text;
namespace
factorypattern
public
class
classa:superclass
} public
class
classb : superclass
} public
class
classc : superclass
} public
class
classd : superclass
} public
inte***ce
ifactory
public
class
afactory : ifactory
} public
class
bfactory : ifactory
} public
class
cfactory : ifactory
} public
class
dfactory : ifactory
} }
客戶端[csharp]view plain
copy
print?
using
system;
using
system.collections.generic;
using
system.text;
namespace
factorypattern
} }
結果這樣,解決了修改分支的問題。但是把選擇交給了客戶端,需要客戶端自己判斷到底需要呼叫哪個類實現,如果需求變化客戶端就需要修改。事物都是具有兩面性的,因此到底使用哪種模式還需要在程式中視情況而定。
讀書筆記6 工廠方法模式
1 概念 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法是乙個類的例項化延伸到子類。2 背景 已經知道工廠模式,有乙個父類superclass,以及這個父類的不同實現方法和演算法的若干個子類classa,classb.有乙個工廠類daofactory,根據客戶端傳來的標識決定呼叫哪個...
設計模式讀書筆記(七) 工廠方法模式
模式定義 工廠方法模式 factory method pattern 又名工廠模式,虛擬構造器 virtual constructor 模式 多型工廠模式 polymorphic factory 模式,它屬於類建立型。在該模式中工廠父類負責定義建立產品物件的公共介面,而工廠子類則負責生成具體產品物件...
讀書筆記 《大話設計模式》工廠方法模式
工廠方法模式,又稱工廠模式 多型工廠模式和虛擬構造器模式,通過定義工廠父類負責定義建立物件的公共介面,而子類則負責生成具體的物件。工廠方法模式,定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到其子類。下圖為計算器程式的工廠方法模式的uml圖結構 下面為計算器程式的...