天天看點

iOS設計模式之單例模式單例模式

所有類都有構造方法,不編碼則系統預設生成空的構造方法,若有顯示定義的構造方法,預設的構造方法就會失效。

單例模式(singleton):保證一個類僅有一個執行個體,并提供一個通路它的全局通路點。

*通常我們可以讓一個全局變量使得一個對象被通路,但它不能防止你執行個體化多個對象。一個最好的辦法就是:讓類自身負責儲存它的唯一執行個體。這個類可以保證沒有其他執行個體可以被建立,并且它可以提供一個通路該執行個體的方法。

單例模式的意圖是使得類的一個對象成為系統中的唯一執行個體。

單例模式可以保證唯一的執行個體。

單例模式因為類本身封裝了它的唯一執行個體,這樣它可以嚴格地控制客戶怎麼樣通路他以及何時通路他。簡單來說就是對唯一執行個體的受控通路。

在多線程程式中,多個線程同時,值得注意的是同時通路單例的構造方法,會有可能造成建立多個執行個體的。是以我們需要把程序加一把鎖來處理。lock 是確定當一個線程位于代碼的臨界區時,另一個線程不進去臨界區。如果其他線程試圖進入鎖定的代碼,則它将一直等待,知道該對象被釋放。

雙重鎖定

我們不用讓線程每次都加鎖,而隻是在執行個體未被建立的時候再加鎖處理。同時也能保證多線程的安全。這種做法被稱為double-check locking(雙重鎖定)。

餓漢式單例類:靜态初始化的方式是在自己被加載時就将自己執行個體化。

懶漢式單例類:要在第一次被引用時,才會将自己執行個體化。

懶漢式和餓漢式比較

由于類一加載就執行個體化對象,是以要提前占用系統資源。而懶漢式又會面臨着多線程通路的安全性問題,需要做雙重鎖定這樣的處理才能保證安全。從c#語言的角度來講,餓漢式單例類已經滿足我們的需求了。

類中隻能有一個執行個體,而且必須從一個為人熟知的通路點對其進行通路。

這個唯一的執行個體隻能夠通過子類化進行擴充,而且擴充的對象不會破壞用戶端代碼。

使用uiapplication類。這是架構中最為常用的一個單例類,他提供了一個控制并協調ios應用程式的集中點。

使用uiaccelerometer類。該類讓應用程式可以進行注冊,以接收來自ios裝置内置的加速計的加速度相關資料。應用程式會收到三維空間中沿主軸的線性加速度變化,可以使用這一資料監測裝置的目前方向和目前方向的瞬間變化。

使用nsfilemanager類。

singleton.h

singleton.m

上面這種方式是最安全也是最有效的建立單例的方式。不可能去建立兩個執行個體,而且使100%的線程安全。

幾乎在任何的應用程式中,單例模式都極為常用,并不隻限于ios應用程式開發。

隻要應用程式需要用集中式的類來協助其服務,這個類就應生成單一的執行個體,而不是多個執行個體。

上一篇: 自動化登入
下一篇: java自動化

繼續閱讀