工廠方法(factorymethod)模式是類的建立模式,其用意是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類中。
工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了多型性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。
在工廠方法模式中,核心的工廠類不再負責所有產品的建立,而是將具體建立工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的介面,而不接觸哪乙個產品類被例項化這種細節。這使得工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品。
在factory method模式中,工廠類與產品類往往具有平行的等級結構,它們之間一一對應。
抽象工廠(creator)角色:是工廠方法模式的核心,與應用程式無關。任何在模式中建立的物件的工廠類必須實現這個介面。
具體工廠(concrete creator)角色:這是實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且受到應用程式呼叫以建立產品物件。在上圖中有兩個這樣的角色:bulbcreator與tubecreator。
抽象產品(product)角色:工廠方法模式所建立的物件的超型別,也就是產品物件的共同父類或共同擁有的介面。在上圖中,這個角色是light。
具體產品(concrete product)角色:這個角色實現了抽象產品角色所定義的介面。某具體產品有專門的具體工廠建立,它們之間往往一一對應。
using
system;
public
abstract
class
light
public
class
bulblight : light
public
override
void
turnoff()
}public
class
tubelight : light
public
override
void
turnoff()
}public
abstract
class
creator
public
class
bulbcreator : creator
}public
class
tubecreator : creator
}public
class
client
}工廠方法的活動序列圖
活動過程包括:
客戶端建立bulbcreator物件,客戶端持有此物件的型別是creator,而實際型別是bulbcreator。然後客戶端呼叫bulbcreator的factory方法,之後bulbcreator呼叫bulblight的建構函式創造出產品bulblight物件。
工廠方法模式與簡單工廠模式再結構上的不同不是很明顯。工廠方法類的核心是乙個抽象工廠類,而簡單工廠模式把核心放在乙個具體類上。
工廠方法模式之所以有乙個別名叫多型性工廠模式是因為具體工廠類都有共同的介面,或者有共同的抽象父類。
當系統擴充套件需要新增新的產品物件時,僅僅需要新增乙個具體物件以及乙個具體工廠物件,原有工廠物件不需要進行任何修改,也不需要修改客戶端,很好的符合了"開放-封閉"原則。而簡單工廠模式在新增新產品物件後不得不修改工廠方法,擴充套件性不好。
工廠方法模式退化後可以演變成簡單工廠模式。
使用介面或抽象類
抽象工廠角色和抽象場頻角色都可以選擇由介面或抽象類實現。
使用多個工廠方法
抽象工廠角色可以規定出多於乙個的工廠方法,從而使具體工廠角色實現這些不同的工廠方法,這些方法可以提供不同的商業邏輯,以滿足提供不同的產品物件的任務。
產品的迴圈使用
工廠方法總是呼叫產品類的建構函式以建立乙個新的產品例項,然後將這個例項提供給客戶端。而在實際情形中,工廠方法所做的事情可以相當複雜。
乙個常見的複雜邏輯就是迴圈使用產品物件。工廠物件將已經建立過的產品登記到乙個聚集中,然後根據客戶所請求的產品狀態,向聚集查詢。如果有滿足要求的產品物件,就直接將產品返回客戶端;如果聚集中沒有這樣的產品物件,那麼就建立乙個新的滿足要求的產品物件,然後將這個物件登記到聚集中,再返還給客戶端。"享元模式(flyweight pattern)"就是這樣乙個模式。
多型性的喪失和模式的退化
乙個工廠方法模式的實現依賴於工廠角色和產品角色的多型性。在有些情況下,這個模式可以出現退化。
工廠方法返回的型別應當是抽象型別,而不是具體型別。呼叫工廠方法的客戶端應當依賴抽象產品程式設計,而不是具體產品。如果工廠僅僅返回乙個具體產品物件,便違背了工廠方法的用意,發生退化,這時就不再是工廠模式了。
工廠的等級結構:工廠物件應當有乙個抽象的超型別。如果等級結構中只有乙個具體工廠類的話,抽象工廠就可以省略,發生了退化。
與工廠方法模式有關的模式還包括:
模板方法模式、mvc模式、享元模式、備忘錄模式
//factory method pattern -- real world example
using
system;
using
system.collections;
//"product"
abstract
class
page
//"concreteproduct"
class
skillspage : page
//"concreteproduct"
class
educationpage : page
//"concreteproduct"
class
experiencepage : page
//"concreteproduct"
class
introductionpage : page
//"concreteproduct"
class
resultspage : page
//"concreteproduct"
class
conclusionpage : page
//"concreteproduct"
class
summarypage : page
//"concreteproduct"
class
bibliographypage : page
//"creator"
abstract
class
document
//properties
public
arraylist pages}//
factory method
abstract
public
void
createpages();}//
"concretecreator"
class
resume : document}//
"concretecreator"
class
report : document
}/**/
//////
///class
public
static
void
main(
string
args )}}
C 設計模式 工廠模式
可以方便的使用繼承來實現建立方法的多樣性,區別於使用靜態方法定義簡單工廠。工廠方法模式 定義了乙個建立物件的介面,但由於子類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到了子類。依賴倒置原則 要依賴抽象,不要依賴具體類 以下指導方針將避免你再oo設計中違反依賴倒置原則 盡量達到這個原則,不一定...
C 設計模式 工廠模式
建立型模式,提供了一種建立物件的最佳方式。在工廠模式中,我能在建立物件時不會對客戶端暴露建立邏輯,並且通過使用乙個公用的介面來指向新建立的物件。我們將建立乙個 shape 介面和實現 shape 介面的實體類。下一步是定義工廠類 shapefactory。factorypatterndemo,我們的...
C 設計模式 工廠模式
目錄 基本概念 及例項 工廠方法模式 factory method 定義乙個用於建立物件的介面,讓字類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到其子類 簡單工廠模式的最大優點在使用者工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態例項化相關的類,對於客戶端來說,去除了具體產品的依賴。工...