2016-08-03 102 views
1

我是一名Java初學者,我用來學習它的書似乎有一些神祕的例子和句子,讓我完全迷惑。Java接口上下文中的「工廠方法設計模式」?

我明白接口是什麼以及如何/在哪裏將這個概念應用到現實世界中。但是什麼是工廠方法?術語「工廠方法」是不明確的(JavaScript有不同的含義),所以我提供了該書的片段,以便明確我的問題。這裏是代碼:

interface Service { 
    void method1(); 
    void method2(); 
} 

interface ServiceFactory { 
    Service getService(); 
} 

Service接口只是一個普通的接口。 ServiceFactory界面看起來像一個正常的界面,但它是一個「工廠方法」。那是什麼?它解決了什麼問題,爲什麼我應該使用它們?

+0

嚴格來說,'ServiceFactory'也是一個「普通」接口。工廠方法需要某種實現(從Java 8開始,這可以是接口中的默認方法),因爲它需要生成(創建)某種類型的實例(因此稱爲「工廠」)。您*可以*在接口中指定工廠方法,但仍然需要一個具體的Factory類來創建特定的類型。請參閱https://en.wikipedia。org/wiki/Factory_method_pattern –

+0

[Design Patterns:Factory vs Factory method vs Abstract Factory]可能的副本(http://stackoverflow.com/questions/13029261/design-patterns-factory-vs-factory-method-vs-abstract-工廠) – jaco0646

回答

0

「工廠方法」是一種構造對象的方法。

更具體地說,該術語通常指的是返回其聲明類(直接實例或子類實例)的實例的靜態方法。根據我的經驗,存在令人極其常見的做了幾個案例:

  • 如果需要有多個不同的構造,使用工廠方法可以讓你給他們適當的名稱(而不同的構造函數的調用只能通過來區分參數類型,一目瞭然並不總是顯而易見的)。
  • 如果您需要將一個抽象類的幾個不同實現作爲入口點,那麼factory方法可以實例化相應的子類型。
  • 如果您需要任何類型的緩存邏輯或共享實例,factory方法可以處理該方法,並在適當的情況下返回已存在的實例。
  • 如果您需要做一些副作用的工作,可以通過這樣的方式來命名工廠方法,以便更清楚地知道這些副作用是什麼。

因此,你的例子並不真正涉及到「工廠方法」恕我直言,但你可以作弊一點,並描述getService()作爲一個。 (相反,我只是將ServiceFactory描述爲「工廠」).的好處與工廠方法的好處相同,加上具有實例而不是靜態方法的常見好處。

+1

應該始終注意靜態工廠方法與GoF工廠方法模式不一樣。兩者完全不同。 – jaco0646

+0

@ jaco0646:啊,你說得對。儘管如此,OP的例子似乎並不是任何一個例子。 – ruakh

+1

同意;術語_factory_通常用於非常鬆散地描述任何創建方法。然後將這個鬆散的術語與GoF或其他術語混淆起來,併產生混淆。 – jaco0646

1

工廠方法只是一種封裝對象創建的方法。在您的示例中,您通常不會使用new運算符來創建代替Service的運算符,而是在某個對象上使用工廠方法。

ServiceFactory sf = new ServiceFactoryImpl(); 
// factory method 
Service s = sf.getService(); 

爲了更好地說明該方法的作用,可以將其替換爲createService。現在該方法封裝了創建Service的細節,您可以提供許多種方法(通過重載),可以根據上下文或傳遞給工廠方法的參數讓它返回不同的子類。