欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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



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

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

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

因?yàn)殪o態(tài)工廠方法,具有以下三個(gè)特點(diǎn)——具名、環(huán)保、多子,下面一個(gè)個(gè)來(lái)講。

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

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

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

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

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

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

上面Boolean就是一個(gè)非常好的例子,TRUE和FALSE兩個(gè)變量都是預(yù)先創(chuàng)建好的,而且都是不可變的final對(duì)象,誰(shuí)需要用到了,就給它返回過(guò)去,也不用擔(dān)心被修改了。

下面就是TRUE和FALSE兩個(gè)變量的初始化代碼:

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); 
 
  ...   
} 

> 多子  可以返回原返回類型的任何子類型的對(duì)象

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

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

也正是因?yàn)殪o態(tài)工廠方法有著比構(gòu)造器更大的優(yōu)勢(shì),我們?cè)趧?chuàng)建類時(shí),切忌第一反應(yīng)就是提供公有構(gòu)造器,要優(yōu)先考慮靜態(tài)工廠方法。

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

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

valueOf/Of——類型轉(zhuǎn)換,返回的實(shí)例和入?yún)⒕哂邢嗤闹?,比如Boolean.valueOf()、EnumSet.valueOf()
getInstance——返回一個(gè)預(yù)先創(chuàng)建好的實(shí)例
newInstance——返回一個(gè)新的實(shí)例

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

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

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

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

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

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

是的,不需要。

也就是說(shuō),只有當(dāng)一個(gè)類沒(méi)有提供靜態(tài)工廠方法的時(shí)候,我們才需要使用工廠模式。

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

總結(jié)

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

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

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

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

相關(guān)文章

  • SpringMVC實(shí)戰(zhàn)案例RESTFul實(shí)現(xiàn)添加功能

    SpringMVC實(shí)戰(zhàn)案例RESTFul實(shí)現(xiàn)添加功能

    這篇文章主要為大家介紹了SpringMVC實(shí)戰(zhàn)案例RESTFul實(shí)現(xiàn)添加功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Spring?Boot中KafkaListener的介紹、原理和使用方法案例詳解

    Spring?Boot中KafkaListener的介紹、原理和使用方法案例詳解

    本文介紹了Spring Boot中 @KafkaListener 注解的介紹、原理和使用方法,通過(guò)本文的介紹,我們希望讀者能夠更好地理解Spring Boot中 @KafkaListener 注解的使用方法,并在項(xiàng)目中更加靈活地應(yīng)用
    2023-09-09
  • java實(shí)現(xiàn)html轉(zhuǎn)pdf方法步驟

    java實(shí)現(xiàn)html轉(zhuǎn)pdf方法步驟

    這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)html轉(zhuǎn)pdf方法的相關(guān)資料,要將HTML轉(zhuǎn)換成PDF,我們需要借助Java中的第三方庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • Mybatis Properties 配置優(yōu)先級(jí)詳解

    Mybatis Properties 配置優(yōu)先級(jí)詳解

    這篇文章主要介紹了Mybatis Properties 配置優(yōu)先級(jí),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Hibernate管理Session和批量操作分析

    Hibernate管理Session和批量操作分析

    這篇文章主要介紹了Hibernate管理Session和批量操作的技巧,包括Hibernate管理Session、批量處理數(shù)據(jù)等的常用技巧及注意事項(xiàng),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • java中對(duì)象的比較equal、Comparble、Comparator的區(qū)別

    java中對(duì)象的比較equal、Comparble、Comparator的區(qū)別

    本文主要介紹了java中對(duì)象的比較equal、Comparble、Comparator的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • SpringBoot中的自動(dòng)裝配原理解析

    SpringBoot中的自動(dòng)裝配原理解析

    這篇文章主要介紹了SpringBoot中的自動(dòng)裝配原理解析,自動(dòng)裝配就是指 Spring 容器在不使用<constructor-arg>和<property>標(biāo)簽的情況下,可以自動(dòng)裝配(autowire)相互協(xié)作的Bean之間的關(guān)聯(lián)關(guān)系,將一個(gè) Bean注入其他Bean的Property中,需要的朋友可以參考下
    2023-08-08
  • 使用Idea快速搭建SpringMVC項(xiàng)目的詳細(xì)步驟記錄

    使用Idea快速搭建SpringMVC項(xiàng)目的詳細(xì)步驟記錄

    這篇文章主要給大家介紹了關(guān)于使用Idea快速搭建SpringMVC項(xiàng)目的詳細(xì)步驟,Spring?MVC是一種基于MVC模式的框架,它是Spring框架的一部分,它提供了一種更簡(jiǎn)單和更有效的方式來(lái)構(gòu)建Web應(yīng)用程序,需要的朋友可以參考下
    2024-05-05
  • Java并發(fā)編程學(xué)習(xí)之ThreadLocal源碼詳析

    Java并發(fā)編程學(xué)習(xí)之ThreadLocal源碼詳析

    這篇文章主要給大家介紹了關(guān)于Java并發(fā)編程學(xué)習(xí)之源碼分析ThreadLocal的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字

    java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字

    本文主要介紹了java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02

最新評(píng)論