上篇部落格我們系統的介紹了三種工廠模式,今天我們就來介紹一下單例模式。單例模式雖然簡單,但是還是比較重要的,是常用設計模式之一。在之前的部落格《Objective-C中的單例模式》中介紹了Objective-C中MRC和ARC下的單例模式。單例模式應該說是設計模式中最為簡單的了,但是簡單并不代表其不重要,在程式開發中單例模式的出鏡率還是比較高的。舉個栗子🌰,在使用者登入你的應用後,你要存儲一下使用者的基本資訊對吧,此時将使用者的基本資訊放在單例中是比較合适的。因為在這種場景下,目前登入的使用者隻有一個,而且需要資訊統一,是以我們需要使用單例來實作。
“單例”顧明思議,就是單個執行個體。也就是說一個類在程式運作期間隻能生成一個執行個體。進一步說,如果一個類未被執行個體過,那麼在對類進行執行個體化的時候就建立一個執行個體。如果該類已經被執行個體化了,那麼就不需要對該類進行執行個體化,直接拿過來之前執行個體化的對象使用即可。下方是單例的定義:
單例模式:確定一個類隻有一個執行個體,并提供一個全局通路點。
在Swift中實作單例也是比較簡單的,同樣你可以使用GCD進行單例的建立也可以使用靜态方法和靜态屬性來實作。因為今天部落格中的代碼所涉及的内容隻有一個類,在此就不做類圖了。
一、使用GCD實作單例
GCD在Swift中用着也是非常爽的,下方代碼段是使用GCD中的dispatch_once來實作的,使用方法可OC一直。下方代碼當然是線程安全的,并且使用了類的靜态屬性和靜态方法。在類下方緊跟着的是測試用例,對建立的兩個常量進行位址的列印,我們發現位址是一緻的,這就足以說明兩個常量指向同一塊記憶體位址。有一點需要注意的是我們需要将生成單例的類的構造函數(Swift中是init()函數)聲明成private,這樣就避免了外部使用者直接使用期構造函數直接生成對象了。在GCD這種實作單例的方式中,如果你不将構造器聲明稱private類的的,那麼是可以生成新的對象執行個體的。
代碼和測試用例如下所示:

二、使用靜态私有常量和靜态方法來實作單例
如果你感覺使用dispatch_once來建立單例有些麻煩的話,那麼你可以通過靜态方法來傳回靜态私有常量的形式來建立單例。下方就是先建立了一個私有靜态常量并配置設定值,然後在靜态方法中對其進行傳回。隻要使用者調用sharedInstance()方法時,就會将staticInstance執行個體進行傳回。當然使用這種方式來實作單例時同樣需要将該類的構造方法聲明成私有的方法,防止外部通過構造器來直接生成執行個體。同樣在代碼下方緊跟着的是我們的測試用例,從測試用例中可以看出兩個常量的記憶體位址是一緻的。
因為單例模式較為簡單,是以今天的部落格就寫到這兒吧,還是那句話簡單并不代表不重要呢,以後的部落格我們将會介紹設計模式中的指令模式、擴充卡模式、外觀模式等等。
上述代碼段github分享位址: https://github.com/lizelu/DesignPatterns-Swift
作者:青玉伏案
出處:http://www.cnblogs.com/ludashi/
本文版權歸作者和共部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
如果文中有什麼錯誤,歡迎指出。以免更多的人被誤導。
收履歷:某網際網路公司,招聘iOS/Android靠譜工程師,入職後,可内部聯系樓主,有小禮品贈送,有意者可郵箱投遞履歷:[email protected]