這篇文章主要介紹了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中文網其他相關文章!