單例模式與原型模式

前言

建立型模式(Creational Patterns)提供了一種在建立對象的同時隱藏建立邏輯的方式,而不是使用 new 運算符直接實例化對象。這使得程序在判斷針對某個給定實例須要建立哪些對象時更加靈活。建立型模式有多種,本文將簡單介紹其中的單例模式(Singleton Pattern)與原型模式(Prototype Pattern),這兩種設計模式都是處理對象建立的設計模式。數據庫

單例模式 Singleton Pattern

單例模式能夠說是最經常使用的設計模式之一。單例模式涉及到一個單一的類,該類負責建立本身的對象,同時確保只建立這個類的一個實例。這個類提供了一種訪問其惟一的對象的方式,能夠直接訪問,不須要外部實例化該類的對象。 簡單來講,單例模式具備如下 3 個特色:編程

  1. 單例類只能有一個實例。
  2. 單例類必須可以自我實例化。
  3. 單例類必須給全部其餘對象提供一個全局訪問點。

應用

單例模式是編程中應用比較多的一種設計模式。比較常見的應用場景有:設計模式

  1. 有狀態的工具類對象,各類存儲config類
  2. 建立對象耗時過多或耗資源過多的對象,好比頻繁訪問數據庫或文件的對象
  3. 系統只須要一個實例對象,負責統籌全局的對象等等

單例模式在多線程的應用場合下必須當心使用。若是當惟一實例還沒有建立時,有兩個線程同時調用建立方法,那麼它們同時沒有檢測到惟一實例的存在,從而同時各自建立了一個實例, 這樣就有兩個實例被構造出來,從而違反了單例模式中實例惟一的原則,所以在使用時須要保證其線程安全。此外,因爲單例模式使得對象是能夠全局訪問和修改的,在實現該類時對於其中的一些變量也應當保證線程讀寫安全。緩存

+ (instancetype)sharedInstance {
    static id sharedInstance = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}
複製代碼

優缺點

優勢:安全

  1. 在內存裏只有一個實例,減小了內存的開銷,尤爲是頻繁的建立和銷燬實例
  2. 避免對資源的多重佔用
  3. 能夠全局訪問

缺點:bash

  1. 沒有接口,不能繼承,難以拓展
  2. 單例類的職責太重,必定程度上違背了單一職責原則
  3. 因爲是全局變量,在一個地方更改可能會影響其餘區域

原型模式 Prototype Pattern

所謂原型模式就是用原型實例指定建立對象的種類,而且經過複製這些原型建立新的對象。原型模式能夠說是全部設計模式中最簡單的一種,其核心就是實現一個原型接口,該接口用於建立當前對象的克隆。當直接建立對象的代價比較大時,則採用這種模式。例如,一個對象須要在一個高代價的數據庫操做以後被建立。咱們能夠緩存該對象,在下一個請求時返回它的克隆,在須要的時候更新數據庫,以此來減小數據庫調用。多線程

應用

原型模式的實現主要涉及 3 個角色

  1. Client:提出建立對象的請求
  2. Prototype:這是一個抽象角色,定義了具體原型類所需實現的方法。
  3. Concrete Prototype:此角色須要實現 Prototype 要求的克隆接口。

原型模式十分簡單,只須要實現 clone 接口便可。但 clone 時須要注意深拷貝和淺拷貝的區別。工具

淺拷貝:使用一個已知實例對新建立實例的成員變量逐個賦值,這個方式被稱爲淺拷貝。性能

深拷貝:當一個類的拷貝構造方法,不只要複製對象的全部非引用成員變量值,還要爲引用類型的成員變量建立新的實例,而且初始化爲形式參數實例值。ui

簡單來講,對於對象 A 引用對象 B,對 A 進行淺拷貝得到的是對象 A1 引用對象 B,對 A 進行深拷貝得到的是對象 A1 引用對象 B1。

優缺點

優勢:

  1. 使用原型模式建立對象比直接new一個對象在性能上要好的多,由於Object類的clone方法是一個本地方法,它直接操做內存中的二進制流,特別是複製大對象時,性能的差異很是明顯。
  2. 使用原型模式的另外一個好處是簡化對象的建立,使得建立對象就像咱們在編輯文檔時的複製粘貼同樣簡單。

缺點:

  1. 必須實現克隆接口
  2. 配備克隆方法須要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不必定很容易,特別當一個類引用含有循環結構的時候

單例模式與原型模式的對比

原型模式是在已指定對象的基礎上,而後經過拷貝這些原型對象建立新的對象。而單例模式模式的核心是將類的構造方法私有化,以後在類的內部產生實例化對象,並經過靜態方法返回實例化對象的應用。

相關文章
相關標籤/搜索