我們知道設計模式方面的知識是乙個初中級工程師高階高階工程師過程中一道無法跨越的屏障,學好它並將它應用到自己的專案中是一件充滿樂趣和成就感的事情。本文將講述設計模式中的原型模式,通過閱讀本文你將收穫如下內容:
下面我們分條講述。
如上圖所示,原型模式是指,乙個抽象類prototype
具有乙個clone
方法,其實現類concreteprototype1
、concreteprototype2
實現各自的clone
方法,在使用的時候,呼叫prototype的clone方法可以clone任意實現類。其作用就是快速建立乙個新的物件。請看如下**:
prototype *type = [[concreteprototype1 alloc] init];
//(1)對type所持有的變數進行賦值。
type.a =
type.b =
//(2)儲存type的現有狀態
[array addobject:type];
//(3)繼續變更type的資訊。
type.a =
type.b =
複製**
在上訴**中,在步驟(2)中我們需要暫存一下當前type的狀態,以便後續做比較或者其他用途。按照上面的**是無法實現我們的需求的,因為把type加到陣列之後,之後type的值依然再改變。為了不然type的值變化,我們可能這樣做:
prototype *type = [[concreteprototype1 alloc] init];
//(1)對type所持有的變數進行賦值。
type.a =
type.b =
//(2)儲存type的現有狀態
prototype *temptype = [[concreteprototype1 alloc] init];
temptype.a = type.a
temptype.b = type.b
[array addobject:temptype];
//(3)繼續變更type的資訊。
type.a =
type.b =
複製**
想一想,你是否寫過這樣的**?這樣的**有什麼不好呢?
**冗餘,如果需要多次儲存狀態,可能需要寫多個這樣的賦值邏輯,當然,你可以把它抽出來作為乙個單獨的函式。
如果type物件的屬性中包含了多個其他物件,那麼簡單的賦值操作並不能儲存這些物件的狀態,還需要去建立這些物件,並拷貝其內部屬性,這是相當繁瑣的工程。
看到這裡你可能會想,我根本不會這麼做,我會使用nsobject提供的copy方法,實現nscopying 協議進行複製。你的想法非常贊,其實nscopying就是cocoa框架提供的一種原型模式,在講解之前,我們先說一下,objective-c的淺拷貝和深拷貝。
在以下兩種特別常見的情形,我們會考慮使用此模式:
我們知道,oc中的變數引用有值引用和指標引用。對於值引用而言,沒有深拷貝和淺拷貝的區分,區別在於指標引用。我們先看淺拷貝模型。
深拷貝由上面兩個模型可以看出深拷貝是將記憶體中的資源也進行了乙份拷貝,而淺拷貝只是記憶體資源指標的拷貝。
填寫表單使我們在我們生活中經常遇到,我們要填很多表單,比如說上學要填報名表,上班要填職位表等等,有時候我們填了一般忘記了關鍵資訊或者有其他重要的事要先處理,我們需要先把現有表單資訊儲存下來,等有時間了再拿出來繼續填寫。
首先我們需要乙個表單協議
@protocol form @property (copy, nonatomic) nsstring *name;
@property (copy, nonatomic) nsstring *address;
@property (strong, nonatomic) nsmutablearray *relatedform;
- (void)printself;
- (void)addform:(id)form;
- (id)copy;
@end
複製**
我們還有乙個學校的表單:
@inte***ce schoolform : nsobject @end
@implementation schoolform
@synthesize address;
@synthesize name;
@synthesize relatedform;
- (instancetype)init:(nsstring *)name address:(nsstring *)address
return self;
}- (void)printself
- (void)addform:(id)form
- (nonnull id)copywithzone:(nullable nszone *)zone
return form;
}@end
複製**
使用
@implementation viewcontroller
- (void)viewdidload
@end
複製**
這裡有乙個非常有趣的問題,為什麼要在form
協議裡面新增乙個copy方法,如果不寫成copy,寫為clone方法會怎麼樣?
答案是nsobject類裡面含有copy方法,當呼叫copy方法的時候回自動呼叫copywithzone方法,我們在schoolform的copywithzone方法裡遍歷了所用相關的form, 二這些form的型別實在執行時才能確定的,可能是schoolform也可能是jobform等等。但無論是什麼型別的form,它都繼承自nsobject。所以這是乙個偷梁換柱的操作,看起來像是呼叫form
協議裡的copy方法,其實是呼叫nsobject的copy方法。換成clone的話就不能使用nscopying協議了。
設計模式 原型模式
1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...
設計模式 原型模式
魔術師手拿一張百元大鈔,瞬間又變出兩張。也像配鑰匙一樣,拿一把鑰匙,老師傅就能做出另乙個一模一樣的。像這種複製我們並不陌生,類似於我們設計中的原型模式 本文將從以下幾點 原型模式 概述 結構圖 淺複製深複製 總結 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。允許乙個物件再建立另外...
設計模式 原型模式
原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。1 假設我們現有乙個物件,但是它的型別需要執行期確定,我們不知道它的動態型別是什麼,現在我們想建立它的副本。顯然通過建構函式建立是很麻煩的,這時候我們可以使用原型模式中的clone函式直接得到該物件的副本。2 有些時候我們想要...