JDK中涉及的設(shè)計模式總結(jié)

所有的設(shè)計模式都找了一種JDK中的實(shí)現(xiàn)(并未列出所有实愚,原因是太多嗤放,而且本次整理的目的是通過JDK中的實(shí)例完成設(shè)計模式的梳理和記憶镐作,所以只寫一種實(shí)現(xiàn))暮顺。依次對類,對應(yīng)的方法响驴,功能進(jìn)行介紹透且。

創(chuàng)建模式

1.抽象工廠
javax.xml.parsers.DocumentBuilderFactory抽象類
public static DocumentBuilderFactory newInstance()方法
類功能:使得應(yīng)用程序可以通過XML文件,獲得一個能生成DOM對象的解析器。
方法功能:獲取一個DocumentBuilderFactory的新實(shí)例秽誊。這一靜態(tài)方法會創(chuàng)建一個新的工廠實(shí)例鲸沮。
2.建造者模式
java.lang.StringBuilder,這是一個final類
public StringBuilder append(String str)方法锅论,這一方法是對父類的覆寫讼溺。
類功能:用于一個不可更改的字符序列。
方法功能:根據(jù)現(xiàn)有字符序列和追加字符最易,通過系統(tǒng)拷貝方法System.arraycopy生成一個新的字符序列怒坯。

  1. 工廠模式
    java.text.NumberFormat抽象類
    public final static NumberFormat getInstance()方法
    類功能:用于數(shù)字格式的抽象基類。
    方法功能:返回一個“對當(dāng)前默認(rèn)場景下的一個通用數(shù)字格式”的NumberFormat藻懒。顯然屬于工廠模式的使用剔猿。
    4.原型模式
    java.lang.Object
    protected native Object clone() 方法
    類功能:所有類的父類
    方法功能:根據(jù)現(xiàn)有實(shí)例,返回一個淺拷貝對象嬉荆。
    5.單例模式
    java.lang.RunTime類
    public static Runtime getRuntime()
    類功能:每一個運(yùn)行的java應(yīng)用都會有一個唯一的RunTime類的實(shí)例归敬,這個實(shí)例使得應(yīng)用程序在運(yùn)行期間能夠受到運(yùn)行環(huán)境的影響。
    方法功能:返回一個和當(dāng)前java應(yīng)用關(guān)聯(lián)的RunTime對象鄙早。
    實(shí)現(xiàn)方式:
private static Runtime currentRuntime = new Runtime();  

public static Runtime getRuntime() {
    return currentRuntime;
}    

結(jié)構(gòu)模式

6.適配器模式
java.util.Arrays
public static List asList(T… a)方法
類功能:此類包含了大量對數(shù)組操作的方法汪茧。
方法功能:將一個引用類型的數(shù)組轉(zhuǎn)為一個List。從而可以使用List類的操作來操作數(shù)組對象限番,但是有一點(diǎn)要注意:就是不能使用add(),remove()操作舱污,因?yàn)榉祷氐膌ist底層是基于數(shù)組的,數(shù)組結(jié)構(gòu)是不能更改的扳缕。 list類就是這里的適配器慌闭,通過這個適配器,對數(shù)組的直接操作變?yōu)殚g接操作躯舔。
7.橋接模式
目前沒有找到

8.組合模式
java.awt.Container類
public Component add(Component comp)方法
類功能:一個通用的AWT(Abstract Window Toolkit)容器驴剔,能夠用于存儲其它AWT組件。
方法功能:添加一個AWT組件到容器中粥庄。
9.裝飾器模式
Reader抽象類和Writer抽象類有相同的構(gòu)造器函數(shù)丧失。
構(gòu)造器函數(shù)
類功能:Reader抽象類用于讀一個字符集流;Writer抽象類用于寫一個字符集流惜互。
方法功能:就是構(gòu)造函數(shù)的功能
10.門面模式
javax.faces.context.ExternalContext,內(nèi)部使用了ServletContext, HttpSession, HttpServletRequest, HttpServletResponse等等布讹。
11.享元模式
java.lang.Integer(其它基本類型包裝類(除去Float,Double)也如此,還有BigDecimal)
Integer.valueOf()方法
byte,short训堆,int描验,long,boolean坑鱼,char的包裝型在類加載到JVM時膘流,已經(jīng)緩存了制定范圍的對象引用絮缅,因?yàn)橹档脑O(shè)定使用的是static塊或者常量。其中char的范圍為:0~127呼股;boolean的值為true和false耕魄;其它默認(rèn)范圍都是-127~128。其中int的上限127可以調(diào)整彭谁,這需要調(diào)整JVM的參數(shù)吸奴。
同時利用了享元模式的還有String這個類,因?yàn)樯娴拿總€字符串都是不可變的缠局。
12.代理模式
java.lang.reflect.Proxy類
原理:代理提供了一個static方法用于創(chuàng)建一個動態(tài)代理類和被代理類的實(shí)例则奥。它是所有通過此方式創(chuàng)建動態(tài)代理類的父類。
使用方式:

InvocationHandler handler = new MyInvocationHandler(...);
class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), Foo.class);
Foo f = (Foo) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);

也可以更簡單的寫為:

Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[]{Foo.class},handler);    

行為模式

13.職責(zé)鏈模式
java.util.logging.Logger類
public void log(LogRecord record)
類功能:為系統(tǒng)or組件記錄日志消息甩鳄。如何體現(xiàn)了職責(zé)鏈模式:每個記錄器都跟蹤“父”記錄器逞度,所謂”父”記錄器,就是Logger命名空間中最近的現(xiàn)有祖先妙啃。
方法功能:用于記錄日志信息。這一類中所有其它的日志方法都是通過調(diào)用這一方法實(shí)現(xiàn)日志記錄的俊戳。子類能夠覆寫這一方法從而獲取所有的日志行為揖赴。
14.命令模式
java.lang.Runnable
所有對Runable接口的實(shí)現(xiàn)類
類功能:實(shí)現(xiàn)Runable接口的類,可以被線程執(zhí)行抑胎。
如果體現(xiàn)了命令模式:通過實(shí)現(xiàn)Runable接口的類燥滑,將請求封裝為一個對象,對請求排隊或記錄請求日志阿逃,以及支持可撤銷操作铭拧。允許接受請求的一方?jīng)Q定是否要否決請求,最重要一點(diǎn)就是:命令模式把請求一個操作的對象和怎么執(zhí)行一個操作的對象解耦恃锉。這就是Excutor框架執(zhí)行實(shí)現(xiàn)Runable接口任務(wù)類的體現(xiàn)搀菩。
15.解釋器模式
java.text.Format
類功能:此抽象類用于格式化一些格式敏感的信息,如:日期破托,信息肪跋,數(shù)字等。
實(shí)現(xiàn)方式:此類定義了一些方法土砂,用于:將格式敏感的信息轉(zhuǎn)為String州既。
16.迭代器模式
這個就不說了,很多集合已經(jīng)使用了迭代器進(jìn)行遍歷萝映。

17.中介者模式
java.util.concurrent.Executor接口
定位:行為方法類通常定義為抽象/接口類型(抽象/接口類型通常使用命令模式),此類代理/使用了這一行為實(shí)例吴叶。
如何體現(xiàn) :Executor框架將工作單元和執(zhí)行機(jī)制解耦和。java多線程程序通常把應(yīng)用分解為多個任務(wù)序臂,然后Executor框架將這些任務(wù)映射為固定數(shù)量的線程蚌卤;在底層,操作系統(tǒng)內(nèi)核將這些線程映射到硬件CPU上。
18.備忘錄模式
java.io.Serializable接口
接口功能:只有實(shí)現(xiàn)了Serializable接口的類才能序列化造寝,此接口中沒有任何方法磕洪,只是為類標(biāo)記實(shí)現(xiàn)了此接口的類可以進(jìn)行序列化。而如果一個類想要序列化诫龙,除了實(shí)現(xiàn)這個接口外析显,還要自己寫ReadObject(),WriteObject()方法签赃,用于對流的讀取和輸出谷异。
19.觀察者模式(發(fā)布/訂閱模式)
java.util.EventListener接口
類功能:所有事件監(jiān)聽接口,都必須擴(kuò)展此接口锦聊。
20.狀態(tài)模式
javax.faces.webapp.FacesServlet
實(shí)例方法的執(zhí)行依賴于實(shí)例狀態(tài)歹嘹。
21.策略模式
java.util.Comparator函數(shù)接口
compare()方法
比較器的使用就是:先寫一個比較器,然后對Arrays或者Collections排序的時候孔庭,將寫好的比較器作為參數(shù)傳入排序的方法尺上,就能實(shí)現(xiàn)按照比較器的規(guī)則,對Arrays或者Collections進(jìn)行排序圆到。
比較器方法如何體現(xiàn)策略模式的:策略模式是指:一個類/接口A的行為方法的執(zhí)行怎抛,是通過調(diào)用另一個不同的類/接口B而實(shí)現(xiàn)的。調(diào)用方式是將B作為A的傳入?yún)?shù)芽淡。這和Comparator的原理完全一致马绝。
22.模版方法模式
java.util.AbstractList
所有的非抽象方法
如何體現(xiàn)模版方法模式:模版方法模式定義,就是說:在一個抽象類中行為方法總是有一個默認(rèn)行為挣菲,子類可以直接使用富稻,也可以覆寫。ArrayList繼承了AbstractList白胀,沒有覆寫的方法在使用時椭赋,直接使用Abstract中的方法。
23.訪問者模式
java.nio.file.FileVisitor接口
類功能:一個用于訪問文件的接口纹笼。這一接口的實(shí)現(xiàn)類通過Files.walkFileTree方法實(shí)現(xiàn)對文件樹中每一個文件的訪問纹份。
public static Path walkFileTree(Path start,Set options,
int maxDepth,FileVisitor< super Path> visitor) ,這一方法中回調(diào)了visitor的方法廷痘。
方法實(shí)現(xiàn)上:訪問者對每一個被訪問者都有一個實(shí)現(xiàn)方法蔓涧。每一個被訪問者都有一個通用方法,輸入?yún)?shù)為訪問者笋额,此方法用于調(diào)用訪問者的方法元暴。

參考:https://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市兄猩,隨后出現(xiàn)的幾起案子茉盏,更是在濱河造成了極大的恐慌鉴未,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸠姨,死亡現(xiàn)場離奇詭異铜秆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)讶迁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門连茧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人巍糯,你說我怎么就攤上這事啸驯。” “怎么了祟峦?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵罚斗,是天一觀的道長。 經(jīng)常有香客問我宅楞,道長针姿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任厌衙,我火速辦了婚禮搓幌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘迅箩。我一直安慰自己,他們只是感情好处铛,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布饲趋。 她就那樣靜靜地躺著,像睡著了一般撤蟆。 火紅的嫁衣襯著肌膚如雪奕塑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天家肯,我揣著相機(jī)與錄音龄砰,去河邊找鬼。 笑死讨衣,一個胖子當(dāng)著我的面吹牛换棚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播反镇,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼固蚤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了歹茶?” 一聲冷哼從身側(cè)響起夕玩,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤你弦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后燎孟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禽作,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年揩页,在試婚紗的時候發(fā)現(xiàn)自己被綠了旷偿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡碍沐,死狀恐怖狸捅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情累提,我是刑警寧澤尘喝,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站斋陪,受9級特大地震影響朽褪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜无虚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一缔赠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧友题,春花似錦嗤堰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至戈抄,卻和暖如春离唬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背划鸽。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工输莺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裸诽。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓嫂用,卻偏偏與公主長得像,于是被迫代替她去往敵國和親崭捍。 傳聞我的和親對象是個殘疾皇子尸折,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容