2011-08-26 66 views
7

很多人說他們在他們的項目中使用工廠模式。但是當我真正看到他們的實現時,它看起來完全不同 從定義我已經讀過頭第一本書。在這本書中,他們描述了兩種工廠模式即關於工廠模式的問題

工廠方法: - 類指定其子類來指定哪些 對象基於一些參數來創建。所以我們在這裏希望在基類中的一些 抽象方法whihich將通過該子 類和章節目標實現將是創建一些對象

抽象工廠: - 提供一個工廠(在接口或 抽象的形式工廠),用於創建相關或依賴對象的家庭 而不指定其具體的類。

我這裏有什麼?他們的家庭依賴或相關 對象的意思的問題。讓我們參考http://www.apwebco.com/gofpatterns/creational/AbstractFactory.html。根據我的理解,這意味着在FinancialToolsFactory(在鏈接中)能夠創建TaxProcessor,這是一個產品系列,其中真正的混凝土產品是CanadaTaxProcessorEuropeTaxProcessor。所以在這裏我們將有n具體工廠的數量(在這種情況下爲CanadaFinancialToolsFactoryEuropeFinancialToolsFactory),這將在這種情況下延伸/實施抽象工廠FinancialToolsFactory

請讓我知道,如果上述理解是正確的,我認爲它是工廠模式的關鍵。

第二個問題:

人都在做的工廠模式的名稱是什麼如下:

public class MyFactory 
{ 
    public static <T> T getObject(Class<T> cls) 
    { 
     if (cls == null) 
     { 
      throw new IllegalArgumentException("Invalid className"); 
     } 

     T daoObject = (T)map.get(cls); 

     if (daoObject == null) 
     { 
      daoObject = loadObject(cls); 
     } 

     return daoObject; 
    } 
} 

他們只是從main方法傳遞類像Example.class和獲取的對象實例那個特定的類。 現在,如果我們按照開始時描述的工廠模式的實際概念(來自第一本書)和其他網站,它不會遵循兩種工廠模式中的任何一種。對我來說,它看起來像一個工具類,我們正在傳遞類並獲取對象實例。 如果你同意這個,請讓我知道嗎?

+0

Javadoc是否說這是這些書中解釋的經典工廠模式的實現? –

+0

我同意100%回答第二個問題。這是一個「懶加載註冊表」,而不是「工廠」 –

回答

7

您對工廠方法和抽象工廠模式的理解是正確的。

當人們創建只負責創建其他對象的類時,他們自然傾向於將它們命名爲Factory。這本身並不是不合理的。問題是沒有工廠模式

混亂就出現在這裏的原因有兩個:

  • 一些開發商只是想在另一種模式拋出,並聲稱他們正在使用的「工廠模式」,指的是創建其他對象

  • 瞭解設計模式的開發人員可以看到,一個類被稱爲工廠,無論模式是否實現,並且假定它必須是工廠方法或抽象工廠。這是令人困惑的,因爲當時你試圖弄清楚它是哪一個,使人對自己對真實模式的理解產生懷疑。

請記住,設計模式不僅是解決常見問題的解決方案,而且它們有助於建立討論設計的語言。在這種情況下,您所期望的設計語言並不是開發人員實際使用的。如果他們說他們正在使用特定的設計模式,他們所做的只是錯誤的。

+0

謝謝derekerdmann。如果你可以表達你對這個問題的想法,即他們的家屬是依賴的還是相關的對象,那麼它會是偉大的還是你同意我說的依賴或相關的對象家族? –

+0

因此,假設我有一個帶有一個方法的類,該方法接受一個字符串,並且返回一個由字符串給定的類的實例,以及傳遞給構造函數的參數的一些參數,這些參數是否通過反射分類爲Factory模式? –

+0

@Mohit Gupta - 是的,你的理解是正確的。 – derekerdmann

2

它們意味着什麼家人依賴性或相關對象

由四人幫運用Design Patterns一個例子:

  • AbstractFactoryWidgetFactory
  • ConcreteFactoryMotifWidgetFactoryPMWidgetFactory
  • AbstractProductWindowScrollBar
  • ConcreteProductMotifWindowMotifScrollBarPMWindowPMScrollBar

public abstract class WidgetFactory {...}

public class MotifWidgetFactory extends WidgetFactory {...}

public class PMWidgetFactory extends WidgetFactory {...}

讓我們從MotifWidgetFactory開始。它將生產一系列擴展或實施抽象產品的混凝土產品。由於它們都是由同一家工廠建造的,所以它們一起玩耍。您無法使用MotifWindowPMScrollBar合作。

人們對工廠模式的名稱做了什麼以下...它看起來像一個工具類,我們正在傳遞類和獲取對象實例。

您的示例是一個工廠,它生成一個對象。在這種情況下,從Map中檢索單例。它不遵循「工廠方法」或「抽象工廠」模式,因此只是名稱上的工廠。

0

只是對與這個問題相關的Java標記的觀察。儘管本書與Java相關,但它與GOF設計模式「大致耦合」,與大多數O-O語言相似。

該設計因此可能與其他語言有關。