建立型模式是用來建立對象的模式,抽象了執行個體化的過程,幫助一個系統獨立于其他關聯對象的建立、組合和表示方式。單例模式目的:保證一個類僅有一個執行個體,并提供一個通路它的全局通路點。
winter
單例模式也是建立型的設計模式之一,本文是設計模式系列(共24節)的第2篇文章。設計模式是基于六大設計原則進行的經驗總結:《第一節:設計模式的六大原則》建立型設計模式共5種:
單例模式(Singleton Pattern):一個類隻有一個執行個體,而且自行執行個體化并向整個系統提供這個執行個體。
工廠方法模式(Factory Pattern):在工廠方法模式中,工廠類成為了抽象類,實際的建立工作将由其具體子類來完成。
抽象工廠模式(Abstract Factory):抽象工廠可以向客戶提供一個接口,建立多個産品族中的産品對象,強調的是“對象系列”的變化。
建造者模式(Builder Pattern):把構造對象執行個體的邏輯移到了類的内部,在類的外部定義了該類的構造邏輯,強調的是産品的構造過程。
原型模式(Prototype Pattern):原型模式和工廠模式一樣,同樣對客戶隐藏了對象建立工作具體的實作細節,通過複制一個現有的對象生成新對象。

單例模式是什麼
單例模式(Singleton Pattern)可以說是整個設計中最簡單的模式之一,且這種模式即使在沒有看設計模式相關資料也經常在編碼開發中。因為在程式設計開發中經常會遇到這樣一種場景,那就是需要保證一個類隻有一個執行個體哪怕多線程同時通路,并需要提供一個全局通路此執行個體的點。綜上以及我們平常的開發中,可以總結一條經驗,單例模式主要解決的是,一個全局使用的類頻繁的建立和消費,進而提升提升整體的代碼的性能。
普通模式(非線程安全)
普通模式的特點是:不允許外部直接建立,且對象是全局共享。
下面 例子1 是普通實作方法的單例模式,也是我們最常用的:
代碼分析:
是以雖然在預設的構造函數上添加了私有屬性private,也确實滿足了懶加載,但是如果有多個通路者同時去擷取對象執行個體,你可以想象很多人在搶廁所,就會造成多個同樣的執行個體并存,是以是非線程安全的。
餓漢模式(線程安全)
餓漢式單例模式的特點是:類在加載時就直接初始化了執行個體。即使沒用到,也會執行個體化,是以,它也是線程安全的單例模式。
下面 例子2 是餓漢模式:
懶漢模式(加鎖&線程安全)
懶漢式單例模式的特點:對比普通模式,給方法加了排它鎖,這是線程安全的寫法;對比餓漢模式,全局對象隻會在用到時才會進行初始化。
下面 例子3 是懶漢模式:
雙重校驗模式
雙重校驗模式的特點:考慮到多線程下的并發操作,全局對象使用了 volatile關鍵字 修飾,同時在對象初始化時進行加鎖防止對象被其他線程重複建立。
此處可以參考《Java并發程式設計實戰》的 第3章volatile的使用。
下面 例子4 是雙重校驗模式:
内部類模式
内部類模式的特點是:由于靜态内部類跟外部類是平級的,是以外部類加載的時候不會影響内部類,是以實作了懶加載。
下面 例子5 是内部類模式:
枚舉類模式
枚舉類模式的特點是:建立一個枚舉類,封裝一個對象,通過枚舉類的私有構造器,強化了單例模式,且實作了懶加載,當唯一全局入口被調用才會初始化對象。
此處可以參考《Effective Java》的 第3點 以及 第4點。
下面 例子6 枚舉類模式:
通過私有化構造器可以強化單例屬性。
總結
單例模式應該是最常見的設計模式之一了,它歸類在設計模式建立型模式,用于解決對象建立的對象複用問題。建立型模式還包括:原型模式、工廠模式、抽象工廠模式和建造者模式,待後續我們再細細解讀。
掃描二維碼
擷取技術幹貨
背景技術彙