2015-04-01 75 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年前,当设计模式首次被开发人员采用时,单例模式开始流行起来。在那之后的几年中,单身已经被淘汰,因为在单元测试中嘲讽是非常困难的。所以最简单的答案是完全放弃单身模式,转而采用更友好的模式。