類簇 (class cluster)
an architecture that groups a number of private, concrete subclasses under a public, abstract superclass. (乙個在共有的抽象超類下設定一組私有子類的架構)class cluster 的想法很簡單: 使用資訊進行(類的)初始化處理期間,會使用乙個抽象類(通常作為初始化方法的引數或者判定環境的可用性引數)來完成特定的邏輯或者例項化乙個具體的子類。而這個"public facing(面向公眾的)"類,必須非常清楚他的私有子類,以便在面對具體任務的時候有能力返回乙個恰當的私有子類例項。對呼叫者來說只需知道物件的各種api的作用即可。這個模式隱藏了他背後複雜的初始化邏輯,呼叫者也不需要關心背後的實現。
這個模式的精妙的地方在於,呼叫者可以完全不管子類,事實上,這可以用在設計乙個庫,可以用來交換實際的返回的類,而不用去管相關的細節,因為它們都遵從抽象超類的方法。
我們的經驗是使用類簇可以幫助移除很多條件語句。
比較基礎的實現是用條件語句檢查裝置,然後執行不同的邏輯。雖然剛開始可能不錯,但是隨著**的增長,執行邏輯也會趨於複雜。 乙個更好的實現的設計是建立乙個抽象而且寬泛的 view controller 來包含所有的共享邏輯,並且對於不同裝置有兩個特別的子例。
通用的 view controller 會檢查當前裝置並且返回適當的子類。
@implementationzockintsugiphotoviewcontroller
- (id)initwithphotos
:(nsarray *)photos
else
return self;
}return [super
initwithnibname:
nilbundle:
nil];
}@end
這個子例程展示了如何建立乙個類簇。
使用[self ismemberofclass:zockintsugiphotoviewcontroller.class]
防止子類中過載初始化方法,避免無限遞迴。當[[zockintsugiphotoviewcontroller alloc] initwithphotos:photos]
被呼叫時,上面條件表示式的結果將會是true。
self = nil
的目的是移除zockintsugiphotoviewcontroller
例項上的所有引用,例項(抽象類的例項)本身將會解除分配( 當然arc也好mrc也好dealloc都會發生在main runloop這一次的結束時)。
接下來的邏輯就是判斷哪乙個私有子類將被初始化。我們假設在iphone上執行這段**並且zockintsugiphotoviewcontroller_iphone
沒有過載initwithphotos:
方法。這種情況下,當執行self = [[zockintsugiphotoviewcontroller_iphone alloc] initwithphotos:photos];
,zockintsugiphotoviewcontroller
將會被呼叫,第一次檢查將會在這裡發生,鑑於zockintsugiphotoviewcontroller_iphone
不完全是zockintsugiphotoviewcontroller
,表示式[self ismemberofclass:zockintsugiphotoviewcontroller.class]
將會是false,於是就會呼叫[super initwithnibname:nil bundle:nil]
,於是就會進入zockintsugiphotoviewcontroller
的初始化過程,這時候因為呼叫者就是zockintsugiphotoviewcontroller
本身,這一次的檢查必定為true,接下來就會進行正確的初始化過程。(note:這裡必須是完全遵循designated initializer 以及secondary initializer的設計規範的前提下才會其效果的!不明白這個規範的可以後退一步熟悉這種規範在回頭來看這個說明)
note: 這裡的意思是,**是在iphone上除錯的,程式設計師使用了self = [[zockintsugiphotoviewcontroller_iphone alloc] initwithphotos:photos];
來初始化某個view controller的物件,當**執行在ipad上時,這個初始化過程也是正確的,因為無論程式設計師的**中使用self = [[zockintsugiphotoviewcontroller_iphone alloc] initwithphotos:photos];
來初始化viewcontroller(iphone上編寫執行在ipad上),還是使用self = [[zockintsugiphotoviewcontroller_ipad alloc] initwithphotos:photos];
來初始化viewcontroller(ipad上編寫,執行在iphone上),都會因為zockintsugiphotoviewcontroller的initwithphotos:
方法的存在而變得通用起來。
iOS設計模式 抽象工廠
ios設計模式 抽象工廠 原理圖 1.抽象工廠指的是提供乙個建立一系列相關或者相互依賴物件的介面,而無需指定它們具體的類 2.如果多個類有相同的行為,但實際實現不同,則可能需要某種抽象型別作為其父類被繼承,抽象型別定義了所有相關具體類將共有的共同行為原始碼 brandingfactory.h abs...
抽象工廠模式 抽象工廠模式
抽象工廠模式其實是圍繞了乙個超級工廠建立其他的工廠 可參考工廠模式 這個超級工廠又可以想像成是其他工廠的工廠,這種設計模式是一種建立型模式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指出其類。每個生成的工廠都能按照工廠模式提供物件。意圖提供乙個建立一系列相關或相互依賴物件的介面,...
iOS 設計模式之抽象工廠
設計模式是程式提公升的必備知識,這裡說下ios怎樣實現抽象工廠設計模式。本文是看過oc程式設計之道這本的抽象工廠這章後寫出的,假設不明確原理能夠看看那本書。testview.h首先建立乙個檢視 testview.h abstractfactory created by 杜甲 on 11 10 14....