工廠方法 Factory Method 模式

2021-08-13 17:44:44 字數 3295 閱讀 2573

一、工廠方法(factory method)模式

工廠方法(factorymethod)模式是類的建立模式,其用意是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類中。

工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了多型性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。

在工廠方法模式中,核心的工廠類不再負責所有產品的建立,而是將具體建立工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的介面,而不接觸哪乙個產品類被例項化這種細節。這使得工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品。

在factory method模式中,工廠類與產品類往往具有平行的等級結構,它們之間一一對應。

二、factory method模式角色與結構:

抽象工廠(creator)角色:是工廠方法模式的核心,與應用程式無關。任何在模式中建立的物件的工廠類必須實現這個介面。

具體工廠(concrete creator)角色:這是實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且受到應用程式呼叫以建立產品物件。在上圖中有兩個這樣的角色:

bulbcreator與tubecreator。

抽象產品(product)角色:工廠方法模式所建立的物件的超型別,也就是產品物件的共同父類或共同擁有的介面。在上圖中,這個角色是light。

具體產品(concrete product)角色:這個角色實現了抽象產品角色所定義的介面。某具體產品有專門的具體工廠建立,它們之間往往一一對應。

三、程式舉例:

usingsystem;

publicabstractclasslight

publicclassbulblight:light

publicoverridevoidturnoff()

}publicclasstubelight:light

publicoverridevoidturnoff()

}publicabstractclasscreator

publicclassbulbcreator:creator

}publicclasstubecreator:creator

}publicclassclient

}工廠方法的活動序列圖

活動過程包括:

客戶端建立bulbcreator物件,客戶端持有此物件的型別是creator,而實際型別是bulbcreator。然後客戶端呼叫bulbcreator的factory方法,之後bulbcreator呼叫bulblight的建構函式創造出產品bulblight物件。

四、工廠方法模式與簡單工廠模式

工廠方法模式與簡單工廠模式再結構上的不同不是很明顯。工廠方法類的核心是乙個抽象工廠類,而簡單工廠模式把核心放在乙個具體類上。

工廠方法模式之所以有乙個別名叫多型性工廠模式是因為具體工廠類都有共同的介面,或者有共同的抽象父類。

當系統擴充套件需要新增新的產品物件時,僅僅需要新增乙個具體物件以及乙個具體工廠物件,原有工廠物件不需要進行任何修改,也不需要修改客戶端,很好的符合了"開放-封閉"原則。而簡單工廠模式在新增新產品物件後不得不修改工廠方法,擴充套件性不好。

工廠方法模式退化後可以演變成簡單工廠模式。

五、factory method模式演化

使用介面或抽象類

抽象工廠角色和抽象場頻角色都可以選擇由介面或抽象類實現。

使用多個工廠方法

抽象工廠角色可以規定出多於乙個的工廠方法,從而使具體工廠角色實現這些不同的工廠方法,這些方法可以提供不同的商業邏輯,以滿足提供不同的產品物件的任務。

產品的迴圈使用

工廠方法總是呼叫產品類的建構函式以建立乙個新的產品例項,然後將這個例項提供給客戶端。而在實際情形中,工廠方法所做的事情可以相當複雜。

乙個常見的複雜邏輯就是迴圈使用產品物件。工廠物件將已經建立過的產品登記到乙個聚集中,然後根據客戶所請求的產品狀態,向聚集查詢。如果有滿足要求的產品物件,就直接將產品返回客戶端;如果聚集中沒有這樣的產品物件,那麼就建立乙個新的滿足要求的產品物件,然後將這個物件登記到聚集中,再返還給客戶端。

"享元模式(flyweight pattern)"就是這樣乙個模式。

多型性的喪失和模式的退化

乙個工廠方法模式的實現依賴於工廠角色和產品角色的多型性。在有些情況下,這個模式可以出現退化。

工廠方法返回的型別應當是抽象型別,而不是具體型別。呼叫工廠方法的客戶端應當依賴抽象產品程式設計,而不是具體產品。如果工廠僅僅返回乙個具體產品物件,便違背了工廠方法的用意,發生退化,這時就不再是工廠模式了。

工廠的等級結構:工廠物件應當有乙個抽象的超型別。如果等級結構中只有乙個具體工廠類的話,抽象工廠就可以省略,發生了退化。

六、factory method模式與其它模式的關係

與工廠方法模式有關的模式還包括:

模板方法模式、mvc模式、享元模式、備忘錄模式

七、另外乙個例子

//factorymethodpattern--realworldexample

usingsystem;

"product"

abstractclasspage

//"concreteproduct"

classskillspage:page

//"concreteproduct"

classeducationpage:page

//"concreteproduct"

clas***periencepage:page

//"concreteproduct"

classintroductionpage:page

//"concreteproduct"

classresultspage:page

//"concreteproduct"

classconclusionpage:page

//"concreteproduct"

classsummarypage:page

//"concreteproduct"

classbibliographypage:page

//"creator"

abstractclassdocument

//properties

publicarraylistpages

}//factorymethod

abstractpublicvoidcreatepages();

}//"concretecreator"

classresume:document

}//"concretecreator"

classreport:document

}///

///factorymethodapptest

///classfactorymethodapp}}

工廠方法模式

概述在軟體系統中,經常面臨著 某個物件 的建立工作,由於需求的變化,這個物件的具體實現經常面臨著劇烈的變化,但是它卻擁有比較穩定的介面。如何應對這種變化?提供一種封裝機制來隔離出 這個易變物件 的變化,從而保持系統中 其它依賴該物件的物件 不隨著需求的改變而改變?這就是要說的factory meth...

簡單工廠模式,工廠方法模式和抽象工廠模式的異同

簡單工廠模式,工廠方法模式和抽象工廠模式都是屬於建立型設計模式,這三種建立型模式都不需要知道具體類。我們掌握一種思想,就是在建立乙個物件時,需要把容易發生變化的地方給封裝起來,來控制變化 變化,封裝 以適應客戶的變動,專案的擴充套件。用這三種設計模式都可以實現,那究竟這三種設計模式有什麼異同呢?下面...

削減工廠成本的方法

第一講削減人員成本 1.1 精簡組織 1.2 工作抽樣 1.3 提高勞動效率 1.4 消除系統損耗 第二講削減採購成本 上 2.1 建立 資訊體系 2.2 採購人員的選擇 2.3 正確考核採購人員 第三講削減採購成本 下 3.1 採購過程控制 3.2 採購合同的制訂 3.3 正確考核 商 第四講削減...