建立型模式(Creational Patterns)提供了一種在建立對象的同時隱藏建立邏輯的方式,而不是使用 new 運算符直接實例化對象。這使得程序在判斷針對某個給定實例須要建立哪些對象時更加靈活。建立型模式有多種,本文將簡單介紹其中的單例模式(Singleton Pattern)與原型模式(Prototype Pattern),這兩種設計模式都是處理對象建立的設計模式。數據庫
單例模式能夠說是最經常使用的設計模式之一。單例模式涉及到一個單一的類,該類負責建立本身的對象,同時確保只建立這個類的一個實例。這個類提供了一種訪問其惟一的對象的方式,能夠直接訪問,不須要外部實例化該類的對象。 簡單來講,單例模式具備如下 3 個特色:編程
單例模式是編程中應用比較多的一種設計模式。比較常見的應用場景有:設計模式
單例模式在多線程的應用場合下必須當心使用。若是當惟一實例還沒有建立時,有兩個線程同時調用建立方法,那麼它們同時沒有檢測到惟一實例的存在,從而同時各自建立了一個實例, 這樣就有兩個實例被構造出來,從而違反了單例模式中實例惟一的原則,所以在使用時須要保證其線程安全。此外,因爲單例模式使得對象是能夠全局訪問和修改的,在實現該類時對於其中的一些變量也應當保證線程讀寫安全。緩存
+ (instancetype)sharedInstance {
static id sharedInstance = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
複製代碼
優勢:安全
缺點:bash
所謂原型模式就是用原型實例指定建立對象的種類,而且經過複製這些原型建立新的對象。原型模式能夠說是全部設計模式中最簡單的一種,其核心就是實現一個原型接口,該接口用於建立當前對象的克隆。當直接建立對象的代價比較大時,則採用這種模式。例如,一個對象須要在一個高代價的數據庫操做以後被建立。咱們能夠緩存該對象,在下一個請求時返回它的克隆,在須要的時候更新數據庫,以此來減小數據庫調用。多線程
原型模式十分簡單,只須要實現 clone 接口便可。但 clone 時須要注意深拷貝和淺拷貝的區別。工具
淺拷貝:使用一個已知實例對新建立實例的成員變量逐個賦值,這個方式被稱爲淺拷貝。性能
深拷貝:當一個類的拷貝構造方法,不只要複製對象的全部非引用成員變量值,還要爲引用類型的成員變量建立新的實例,而且初始化爲形式參數實例值。ui
簡單來講,對於對象 A 引用對象 B,對 A 進行淺拷貝得到的是對象 A1 引用對象 B,對 A 進行深拷貝得到的是對象 A1 引用對象 B1。
優勢:
缺點:
原型模式是在已指定對象的基礎上,而後經過拷貝這些原型對象建立新的對象。而單例模式模式的核心是將類的構造方法私有化,以後在類的內部產生實例化對象,並經過靜態方法返回實例化對象的應用。