激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java靜態(tài)工廠方法的實例詳解

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

2020-12-30 11:41hzy38324 Java教程

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

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

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

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

?
1
2
3
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)用時就會一頭霧水,到底應(yīng)該調(diào)用哪一個呢。

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

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

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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方法為例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 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)建類時,切忌第一反應(yīng)就是提供公有構(gòu)造器,要優(yōu)先考慮靜態(tài)工廠方法。

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

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

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

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

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

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

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

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

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

是的,不需要。

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

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

總結(jié)

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

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

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

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

原文鏈接:http://blog.csdn.net/hzy38324/article/details/72630415

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产一区二区影视 | 国产精品一区在线观看 | 国产一级αv片免费观看 | 色蜜桃av| 性生活视频网站 | 狠狠干精品视频 | 亚洲免费看片网站 | 九九热在线视频观看这里只有精品 | 在线观看中文字幕国产 | 日本高清在线免费 | ⅴideo裸体秀hd | 精品一区二区久久久久久按摩 | 亚洲二区不卡 | 羞羞视频免费入口网站 | 国产精品久久久久久久久久三级 | 久久综合九色 | 久久久免费电影 | 免费视频www在线观看 | 国产精品一区二区免费在线观看 | 欧美亚洲综合网 | 毛片天天看 | 日本黄视频在线观看 | 日日草夜夜 | 精品国产一区二区三区天美传媒 | 国产午夜精品久久久久久久蜜臀 | 国内精品国产三级国产a久久 | 久久久一区二区三区四区 | 久久里面有精品 | 成人免费看视频 | 亚洲精品一区中文字幕 | 精品国产一区二区三区久久久 | 蜜桃传媒视频麻豆第一区免费观看 | 欧美日韩亚洲在线 | 国产成人精品一区二区视频免费 | 久久久久国产精品久久久久 | 欧美一级鲁丝片免费看 | 天天躁狠狠躁夜躁2020挡不住 | 亚洲成人黄色片 | 国产亚洲综合一区二区 | 娇喘视频在线观看 | 久久国产精品免费视频 |