最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java靜態(tài)工廠方法的實例詳解

 更新時間:2017年09月08日 14:47:43   投稿:lqh  
這篇文章主要介紹了 Java靜態(tài)工廠方法的實例詳解的相關資料,希望通過本文大家能掌握java今天工廠方法,需要的朋友可以參考下

 Java靜態(tài)工廠方法的實例詳解

什么是靜態(tài)工廠方法

對于類而言,為了讓使用者獲取它自身的一個實例,最常用的方法就是提供一個公有的構(gòu)造器。
當然,這里要介紹的是另一種方法——靜態(tài)工廠方法,一個返回類的實例的靜態(tài)方法。
舉個例子,Boolean的一個將基本類型boolean轉(zhuǎn)為封裝類的方法,valueOf:



public static Boolean valueOf(boolean b) { 
  return (b ? TRUE : FALSE); 
} 

為什么要使用靜態(tài)工廠方法

那么,我們?yōu)槭裁匆褂渺o態(tài)工廠方法,而不是使用構(gòu)造器呢?

因為靜態(tài)工廠方法,具有以下三個特點——具名、環(huán)保、多子,下面一個個來講。

> 具名  靜態(tài)工廠方法有名稱

對于構(gòu)造器來說,根據(jù)入?yún)⒌牟煌梢杂卸鄠€構(gòu)造器,但是這些構(gòu)造器的名稱都是一樣的,使用者在調(diào)用時就會一頭霧水,到底應該調(diào)用哪一個呢。

而使用了靜態(tài)工廠方法之后,你可以根據(jù)方法的功能給方法起不同的名字,只有名字起得好,使用者看到方法名就知道是什么意思,知道這時候應該調(diào)用哪一個方法,大大提高了代碼的可讀性。

> 環(huán)保  不必每次調(diào)用的時候都創(chuàng)建一個新對象

使用構(gòu)造器,每次都會產(chǎn)生一個新的對象。

而靜態(tài)工廠方法,可以重復地返回預先創(chuàng)建好的對象。

上面Boolean就是一個非常好的例子,TRUE和FALSE兩個變量都是預先創(chuàng)建好的,而且都是不可變的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); 
 
  ...   
} 

> 多子  可以返回原返回類型的任何子類型的對象

使用構(gòu)造器,你只能返回一種類型的對象;而使用靜態(tài)工廠方法,你可以根據(jù)需要,返回原返回類型的任何子類型的對象。
以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); 
} 

這個方法,出于性能的考慮,具體返回什么類型,由枚舉類型的數(shù)量決定,超過64,則返回JumboEnumSet,否則返回RegularEnumSet,而這兩種類對于使用者來說是不可見的,使用者只需要知道他是EnumSet就好。

也正是因為靜態(tài)工廠方法有著比構(gòu)造器更大的優(yōu)勢,我們在創(chuàng)建類時,切忌第一反應就是提供公有構(gòu)造器,要優(yōu)先考慮靜態(tài)工廠方法。

常見的靜態(tài)工廠方法名

這里附上靜態(tài)工廠方法的一些約定俗成的名稱:

valueOf/Of——類型轉(zhuǎn)換,返回的實例和入?yún)⒕哂邢嗤闹担热鏐oolean.valueOf()、EnumSet.valueOf()
getInstance——返回一個預先創(chuàng)建好的實例
newInstance——返回一個新的實例

靜態(tài)工廠方法難道不就是工廠模式嗎?

講到這里,可能會有很多人覺得這不就是工廠模式嗎?答:并不完全相同。
本文講的靜態(tài)工廠方法,和工廠模式一樣,都是用來取代構(gòu)造器的方法,都具有上面說的三個優(yōu)勢:具名、環(huán)保、多子。

但是,兩者的實現(xiàn)方式和使用場景并不相同。

首先,直觀上看,在代碼結(jié)構(gòu)上,我們說的工廠模式,通常需要一個xxxFactory類,在里面定義工廠方法;而本文講的靜態(tài)工廠

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

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

是的,不需要。

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

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

總結(jié)

靜態(tài)工廠方法具有三大優(yōu)勢——具名、環(huán)保、多子。

如果一個類提供了靜態(tài)工廠方法,那么也就不需要考慮對這個類進行工廠模式了。

我們在創(chuàng)建類時,切忌第一反應就是提供公有構(gòu)造器,要優(yōu)先考慮靜態(tài)工廠方法。

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • Java實現(xiàn)簡單訂餐系統(tǒng)

    Java實現(xiàn)簡單訂餐系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單訂餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 解析java中的condition

    解析java中的condition

    Condition 將 Object 監(jiān)視器方法(wait()、notify()和notifyAll())分解成截然不同的對象,以便通過將這些對象與任意Lock實現(xiàn)組合使用,為每個對象提供多個等待 set(wait-set)
    2021-06-06
  • 使用eclipse快速新建spirngboot項目的方法

    使用eclipse快速新建spirngboot項目的方法

    本篇文章主要介紹了使用eclipse快速新建spirngboot項目的方法,具有一定的參考價值,有興趣的可以了解一下
    2017-04-04
  • MyBatis輸入映射和輸出映射實例詳解

    MyBatis輸入映射和輸出映射實例詳解

    mapper.xml是我們配置操作數(shù)據(jù)庫的sql語句的地方.這篇文章主要介紹了MyBatis輸入映射和輸出映射實例詳解,需要的朋友可以參考下
    2017-02-02
  • SpringBoot上傳文件大小受限問題的解決辦法

    SpringBoot上傳文件大小受限問題的解決辦法

    最近有一次由于項目升級發(fā)現(xiàn)了一個上傳方面的問題,下面這篇文章主要給大家介紹了關于SpringBoot上傳文件大小受限問題的解決辦法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • Java使用策略模式解決商場促銷商品問題示例

    Java使用策略模式解決商場促銷商品問題示例

    這篇文章主要介紹了Java使用策略模式解決商場促銷商品問題,簡單描述了策略模式的概念、原理,并結(jié)合實例形式分析了Java基于策略模式解決商品促銷問題的相關操作技巧,需要的朋友可以參考下
    2018-05-05
  • java操作ElasticSearch聚合查詢的示例代碼

    java操作ElasticSearch聚合查詢的示例代碼

    這篇文章主要介紹了java操作ElasticSearch聚合查詢的示例代碼,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2024-08-08
  • JAVA使用爬蟲抓取網(wǎng)站網(wǎng)頁內(nèi)容的方法

    JAVA使用爬蟲抓取網(wǎng)站網(wǎng)頁內(nèi)容的方法

    這篇文章主要介紹了JAVA使用爬蟲抓取網(wǎng)站網(wǎng)頁內(nèi)容的方法,實例分析了java爬蟲的兩種實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • java模擬客戶端向服務器上傳文件

    java模擬客戶端向服務器上傳文件

    這篇文章主要為大家詳細介紹了java模擬客戶端向服務器上傳文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Java關于重排鏈表詳細解析

    Java關于重排鏈表詳細解析

    在我們平時的代碼過程中,鏈表是我們經(jīng)常遇到的一個數(shù)據(jù)結(jié)構(gòu),面試題中鏈表占很大一部分,可見鏈表操作是非常重要的。本篇文章我們來探究一下如何進行重排鏈表
    2022-01-01

最新評論

吐鲁番市| 金湖县| 金阳县| 昔阳县| 崇礼县| 原阳县| 石嘴山市| 湟中县| 璧山县| 门源| 建瓯市| 江永县| 涡阳县| 鱼台县| 平和县| 靖安县| 饶河县| 洱源县| 化州市| 桐梓县| 府谷县| 延安市| 阳高县| 阿合奇县| 庄浪县| 万宁市| 许昌县| 新干县| 顺义区| 华阴市| 永新县| 达日县| 越西县| 日照市| 天门市| 石门县| 泰州市| 宝坻区| 驻马店市| 金塔县| 繁峙县|