天天看點

Design Pattern: Factory Method 模式

     簡單的說就是定義一個用于建立對象的接口,讓子類決定将哪一個類執行個體化。factory method使一個類的執行個體化延遲到其子類。

考慮一個狀況,您所經營的工廠正在生産一個新的電視機産品,現在有一個問題發生了,您的電視機産品所有的元件都可以自行生産,像是操作面版、電源、搖控裝置等等等,但熒幕卻必須依賴另一個廠商或子廠商供應,這時您怎麼辦?  您不能将生産進度停下了,相反的您必須确定一些事情,您知道有關于熒幕控制的所有介面,您可以将這些對介面的操作溝通先實作,等到熒幕到了,直接将熒幕與您的半成品組合起來,一個完整的成品即可出廠。  factory method模式在一個抽象類中留下某個建立元件的抽象方法沒有實作,其它與元件操作相關聯的方法都先依賴于元件所定義的介面,而不是依賴于元件的實作, 當您的成品中有一個或多個元件無法确定時,您先确定與這些元件的操作介面,然後用元件的抽象操作介面先完成其它的工作,元件的實作(實作)則推遲至實作元 件介面的子類完成,一旦元件加入,即可完成您的成品。  再舉一個例子,假設您要完成一個檔案編輯器,您希望這個編輯器可以适用于所有類型的檔案編輯,例如rtf、doc、txt等等,盡管這些檔案有着不同的格 式,您先确定的是這些檔案必然具備的一些操作介面,例如儲存、開啟、關閉等等,您用一個idocument類型來進行操作,這麼一來這個架構就無需考慮實 際的儲存、開啟等細節是如何進行的。  abstracteditor中的createdocument()方法是個抽象方法,因為架構不知道您将實作一個什麼類型的檔案,這個抽象方法将推遲至繼承abstracteditor的子類中實作。  這個架構可用以下簡單的示意程式來作示範,當中實作了一個rtfdocument,雖然在abstracteditor中并不知道我們會套用這個rtfdocument,但您可以看到,透過多型操作,您的架構可以進行對檔案的相關操作。 abstracteditor.java

idocument.java

rtfeditor.java

rtfdocument.java

factory method中的abstractoperator中擁有一個抽象的factorymethod()方法,它負責生成一個iproduct類型的物件,由 于目前還不知道将如何實作這個類型,是以将之推遲至子類别中實作,在abstractoperator中先實作iproduct操作介面溝通的部份,隻要 介面統一了,利用多型操作即可完成各種不同的iproduct類型之物件操作。  也就是說,對abstractoperator來說,其操作的iproduct是可以抽換的。