2013-08-01 56 views
3

在爲Android開發的同時,我遇到了一個類Bitmap類。我覺得很奇怪,這個類沒有公共的構造函數,而是提供了具有完全相同目的的靜態createBitmap函數。爲什麼一些Java庫使用靜態newInstance函數而不是構造函數?

語法上沒有任何優勢:

Bitmap bm = new Bitmap(10, 10); 
Bitmap bm = Bitmap.createBitmap(10, 10); 

我見過的其他類也這麼做,在相當於靜態函數通常命名爲newInstance。這是什麼原因?

+6

這是非常[第一項](HTTP://有效Java書中的my.safaribooksonline.com/book/programming/java/9780137150021/creating-and-destroying-objects/ch02lev1sec1)。你可以通過它。 –

+0

它只是一個設計偏好靜態工廠,就像使用駱駝案例的方法名稱一樣。 –

+0

@RohitJain我意識到這是Java程序員現在的一個愚蠢的問題。這只是我從來沒有在其他語言中見過這種模式。由於我對Java的知識有限,這看起來像是另一種臃腫的語言細節。 – Overv

回答

6

您所描述的內容稱爲工廠方法。它的存在是因爲它提供了獲得符合特定接口的對象的能力,但它可能具有不同的底層實現。

對於(一個完全隨意而平凡的)例子,Factory Method可能會選擇給你一個LinkedList對象而不是一個ArrayList對象,因爲你指定的初始大小在LinkedList中可能具有性能優勢。

但是這兩個列表實現符合IList接口,所以生成的對象作爲IList返回。

+0

我現在明白了,我想我太熟悉並不真正隱藏實現細節的語言。 – Overv

+0

你是指不提供封裝的語言?即使C有這種能力。 –

+1

在問題的評論(http://my.safaribooksonline.com/book/programming/java/9780137150021/creating-and-destroying-objects/ch02lev1sec1)中鏈接的「Effective Java 2nd Edition」書中特別聲明 - 注意靜態工廠方法與設計模式中的工廠方法模式不同[Gamma95, 107]。這個項目中描述的靜態工廠方法在設計模式中沒有直接的等價物。 - –

1

在第一種情況下,您需要實例化一個特定的類型。在第二步中,您將它留給實施者來決定返回哪種類型。

我不熟悉位圖,但另一個例子是EnumSet。當您撥打:

EnumSet<SomeEnum> set = EnumSet.noneOf(SomeEnum.class); 

靜態工廠方法使用取決於項目的在你的枚舉數不同的實現,以儘可能高效的所有情況。

底層代碼返回小枚舉的RegularEnumSet或大枚舉的JumboEnumSet。構造函數無法實現這種上下文優化。

public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) { 
    Enum[] universe = getUniverse(elementType); 
    if (universe == null) 
     throw new ClassCastException(elementType + " not an enum"); 

    if (universe.length <= 64) 
     return new RegularEnumSet<>(elementType, universe); 
    else 
     return new JumboEnumSet<>(elementType, universe); 
} 
1

這是工廠方法模式。

主要有兩個原因,要做到這一點:

  1. 它允許在今後每次不總是返回一個新的實例的可能性。例如,如果值在-127和128之間,那麼Integer.valueOf(int)將重新使用它已創建的相同Integer對象。這些是代碼中使用的最常見的Integer值,因此我們沒有JVM製作數千個相同實例的副本每一個都佔用內存)並且可以重用相同的實例。

  2. 它允許靜態方法返回一個子類,而無需調用者知道。如果將工廠方法與其他設計模式(如代理或適配器)結合以返回該類的修改版本,這可能很有用。

0

編輯:這個問題是一些什麼涵蓋:

Factory, Abstract Factory and Factory Method

Design Patterns: Factory vs Factory method vs Abstract Factory

這就是工廠模式。整個過程就是從靜態類創建類,這樣你就可以隱藏類的編程細節(安全措施)。

來源:

http://www.oodesign.com/factory-pattern.html

意圖:

沒有實例化邏輯暴露於 客戶端創建的對象。通過一個公共接口指的是新創建的對象

實施例:

public class ProductFactory{ 
    public Product createProduct(String ProductID){ 
     if (id==ID1) 
      return new OneProduct(); 
     if (id==ID2) return 
      return new AnotherProduct(); 
     ... // so on for the other Ids 

     return null; //if the id doesn't have any of the expected values 
    } 
    ... 
} 

另一個固體源:

http://sourcemaking.com/design_patterns/factory_method

相關問題