首頁 > Java > java教程 > Java中關於靜態工廠方法的使用詳解

Java中關於靜態工廠方法的使用詳解

黄舟
發布: 2017-09-09 13:11:35
原創
1687 人瀏覽過

這篇文章主要介紹了Java靜態工廠方法的實例詳解的相關資料,希望透過本文大家能掌握java今天工廠方法,需要的朋友可以參考下

 Java靜態工廠方法的實例詳解

什麼是靜態工廠方法

#對於類別而言,為了讓使用者取得它本身的一個實例,最常用的方法就是提供一個公有的構造器。
當然,這裡要介紹的是另一種方法-靜態工廠方法,一個傳回類別的實例的靜態方法。
舉個例子,Boolean的一個將基本型別boolean轉為封裝類別的方法,valueOf:


public static Boolean valueOf(boolean b) { 
  return (b ? TRUE : FALSE); 
}
登入後複製

為什麼要使用靜態工廠方法

那麼,我們為什麼要使用靜態工廠方法,而不是使用建構器呢?

因為靜態工廠方法,有以下三個特點-具名、環保、多子,下面一個個來講。

> 具名  靜態工廠方法有名稱

#對於建構器來說,根據入參的不同可以有多個建構器,但是這些構造器的名稱都是一樣的,使用者在呼叫時就會一頭霧水,到底該呼叫哪一個呢。

而使用了靜態工廠方法之後,你可以根據方法的功能給方法起不同的名字,只有名字起得好,使用者看到方法名稱就知道是什麼意思,知道這時候應該呼叫哪一個方法,大大提高了程式碼的可讀性。

> 環保  不必每次呼叫的時候都會建立一個新物件

使用建構器,每次都會產生一個新的物件。

而靜態工廠方法,可以重複地傳回預先建立好的物件。

上面Boolean就是一個非常好的例子,TRUE和FALSE兩個變數都是預先創建好的,而且都是不可變的final對象,誰需要用到了,就給它返回過去,也不用擔心被修改了。

以下是TRUE和FALSE兩個變數的初始化程式碼:


public final class Boolean implements java.io.Serializable, 
                   Comparable<Boolean> 
{ 
  /** 
   * The {@code Boolean} object corresponding to the primitive 
   * value {@code true}. 
   */ 
  public static final Boolean TRUE = new Boolean(true); 
 
  /** 
   * The {@code Boolean} object corresponding to the primitive 
   * value {@code false}. 
   */ 
  public static final Boolean FALSE = new Boolean(false); 
 
  ...   
}
登入後複製

> 多子  可以傳回原傳回類型的任何子類型的物件

使用建構器,你只能傳回一種類型的物件;而使用靜態工廠方法,你可以根據需要,傳回原回傳類型的任何子類型的物件。
以EnumSet的noneof方法為例:


/** 
 * Creates an empty enum set with the specified element type. 
 * 
 * @param elementType the class object of the element type for this enum 
 *   set 
 * @throws NullPointerException if <tt>elementType</tt> is null 
 */ 
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); 
}
登入後複製

這個方法,出於效能的考慮,具體傳回什麼型,由枚舉型別的數量決定,超過64,則回傳JumboEnumSet,否則回傳RegularEnumSet,而這兩個類別對使用者來說是看不見的,使用者只需要知道他是EnumSet就好。

也正是因為靜態工廠方法有著比建構器更大的優勢,我們在創建類別時,切忌第一反應就是提供公有建構器,要優先考慮靜態工廠方法。

常見的靜態工廠方法名稱

這裡附上靜態工廠方法的一些約定俗成的名稱:

valueOf/ Of——類型轉換,傳回的實例和入參具有相同的值,例如Boolean.valueOf()、EnumSet.valueOf()
getInstance——傳回一個預先建立好的實例
newInstance——傳回一個新的實例

靜態工廠方法不就是工廠模式嗎?

講到這裡,可能會有很多人覺得這不就是工廠模式嗎?答:並不完全相同。
本文講的靜態工廠方法,和工廠模式一樣,都是用來取代構造器的方法,都具有上述的三個優點:具名、環保、多子。

但是,兩者的實作方式和使用場景並不相同。

首先,直觀上看,在程式碼結構上,我們說的工廠模式,通常需要一個xxxFactory類,在裡面定義工廠方法;而本文講的靜態工廠

方法,則只需要一個類,類本身就提供了生產對象的工廠方法。

其次,我們想一下,假如一個類,在設計的時候,就提供了靜態工廠方法,那麼還需要使用工廠模式嗎?

是的,不需要。

也就是說,只有當一個類別沒有提供靜態工廠方法的時候,我們才需要使用工廠模式。

腦洞一下,假如蘋果公司有強大的零件工廠,那它還需要富士康嗎?

總結

靜態工廠方法有三大優點-具名、環保、多子。

如果一個類別提供了靜態工廠方法,那麼也就不需要考慮對這個類別進行工廠模式了。

我們在創建類別時,切忌第一反應就是提供公有建構器,要優先考慮靜態工廠方法。

以上是Java中關於靜態工廠方法的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板