2015-04-01 70 views
1

一個設計問題:製作單的單個副本

我有一個單身(在Objective-C,但它其實並不重要)

的單是一個類(對象),實際上是一個數據結構,很多類訪問,並且是單一的(因此 - 單身)

現在我想添加撤消能力 - 這實際上是保存對象狀態的快照 - 所以我可以回去它。

我真正需要做的是打破對象的單體性(需要它的一個副本)。 但是,這不會讓我在所有課程之間輕鬆分享。

想法?

+0

你應該看看NSUndoManager;它會保存一堆消息和參數來恢復狀態,這比複製整個模型效率更高。在我看來,複製是一個不適合單身模式的概念。 – Jef 2015-04-01 19:45:00

回答

0

你可以在你的單例類中實現一個- (id) copy方法。

在此方法中,分配一個新的類實例,並將其所有屬性設置爲共享實例屬性的副本。

+0

我在那個方向思考(似乎我沒有選擇,因爲深層複製)。這和使用'NSCopying'有什麼區別? – Boaz 2015-04-01 15:07:14

+0

稍候...我的單身實現已經 '+(ID){頁頭@同步 ([MomentCreationShared類]){ NSAssert(_sharedMySingleton ==爲零,@ 「嘗試分配一個單獨的第二個實例。」) ; _sharedMySingleton = [super alloc]; return _sharedMySingleton; } return nil; '我如何解決這個問題? – Boaz 2015-04-01 15:17:25

+0

這不是蘋果推薦做單身人士的方式。 你可以這樣做: '+(id)sharedInstance {0} {0}靜態MySingleton * instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken,^ {instance = [[self alloc] init]; }); 返回實例; }' – Drico 2015-04-02 17:40:58

1

「單元素是一個類(對象),實際上是一種數據結構,許多類的訪問,並且是單一的」

我認爲這是比較容易讓你單身的對象有數據的集合結構體。然後,您只需創建數據結構的副本,而不是單件副本。

+1

有趣...有點矯枉過正(因爲它會改變所有的客戶端,目前我只需要一次撤消)。但我喜歡開箱的想法... – Boaz 2015-04-01 15:08:43

1

大約10年前,當設計模式首次被開發人員採用時,單例模式開始流行起來。在那之後的幾年中,單身已經被淘汰,因爲在單元測試中嘲諷是非常困難的。所以最簡單的答案是完全放棄單身模式,轉而採用更友好的模式。