簡體   English   中英

為什么使用工廠而不是“新”?

[英]Why use a factory instead of 'new'?

我正在閱讀EMF: Eclipse Modeling Framework一書,其中指出:

EMF 編程 model 強烈鼓勵但不要求使用工廠來創建對象。 而不是簡單地使用 new 運算符來創建 [一個對象]...

為什么鼓勵使用工廠而不是new工廠?

您的答案不必是特定於 EMF 的,只要它與 Java 相關即可。

您可以閱讀Effective Java Item 1:考慮靜態工廠方法而不是構造函數。 它詳細描述了使用工廠方法的優點:

  • 靜態工廠方法的一個優點是,與構造函數不同,它們具有名稱

  • 靜態工廠方法的第二個優點是,與構造函數不同,它們不需要在每次調用時創建新對象。

  • 靜態工廠方法的第三個優點是,與構造函數不同,它們可以返回其返回類型的任何子類型的對象。

  • 靜態工廠方法的第四個優點是它們減少了創建參數化類型實例的冗長(自Java 7以來似乎已經過時)

我同意這里給出的大多數答案,但這些參數通常適用於Java中的每個情況,但是在EMF的這種特殊情況下還有另外一個原因:EMF有自己的內省機制,例如,用於序列化和反序列化,它不依賴於Java反射。

例如,對於反序列化,它讀取XML文件,並使用Ecore模型信息和相應的工廠實例化Java對象。 否則它將需要使用Java反射。

這里的答案也不是特定於Java的。

  1. 工廠方法具有名稱,更容易記住,並且不易出錯。
  2. 它們每次調用時都不需要創建新實例,您可以在此處使用預構造類和緩存。
  3. 他們可以返回任何子類型的對象,而不僅僅是new調用的對象
  4. 您可以參數化調用“新”對象。

這個問題的答案在 Yegor Bugayenko 的優雅對象中解釋,第 1 章,在“1.1 永遠不要使用 -er 名稱”部分。

作者說的是:

class 是一個對象工廠。

class 生成對象,盡管我們通常說 class 實例化它們:

class Cash {
    public Cash(int dollars) {
    //...
    }
}
Cash five = new Cash(5);

這與我們所說的工廠模式不同,只是因為 Java 中的這個“新”運算符沒有它應有的強大 您唯一可以使用它的就是創建一個實例——object。 如果我們要求 class Cash 制作一個新的 object,我們會得到一個新的 object。 沒有檢查類似的對象是否已經存在並且可以重用,沒有參數會修改 new 的行為。 等等

“新”運算符是對象工廠的原始控件。

工廠模式是 operator new 的更強大的替代方案,但在概念上它們是相同的。 class 是一個對象工廠。 class 制造物體,跟蹤它們,在必要時銷毀它們,等等。

Java 中的工廠模式就像對新運算符的擴展。 通過在前面添加額外的邏輯,它使其更加靈活和強大。

例如:

class Shapes {
    public Shape make(String name) {
        if (name.equals("circle")) {
            return new Circle();
        }
        if (name.equals("rectangle")) {
            return new Rectangle() ;
        }
        throw new IllegalArgumentException("not found");
    }
}

這是 Java 中的一個典型工廠,它幫助我們使用對象類型的文本名稱來實例化對象。 最后,我們仍然使用 new 運算符。 我的觀點是,從概念上講,工廠模式和新運算符之間沒有太大區別。 在完美的 OOP 語言中,此功能將在新運算符中可用

主要是創建對象的簡單性。 從工廠調用方法比記住構造函數中的每個參數意味着什么更容易+它使代碼中的更改更容易

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM