2015-04-01 2 views
1

дизайн вопрос:Создание одной копии одноточечного

У меня есть одиночки (в Objective-C, но это действительно не имеет значения)

Одноэлементный класс (объект), который на самом деле структура данных, доступная многим классам, и одна (отсюда - одиночный)

Теперь я хочу добавить возможность отмены, которая фактически сохраняет моментальный снимок состояния объекта, поэтому я могу вернуться к Это.

Что мне действительно нужно сделать, так это сломать одноэлементность объекта (нужна одна его копия). Но это не позволит мне делиться ею между всеми классами.

Идеи?

+0

Вы должны изучить NSUndoManager; он сохраняет стек сообщений и аргументов для восстановления состояния, что намного эффективнее, чем копирование всей модели. На мой взгляд, копирование - это концепция, которая не очень хорошо вписывается в одноэлементный узор. – Jef

ответ

0

В вашем одноточечном классе можно реализовать метод - (id) copy.

В этом методе выделите новый экземпляр вашего класса и установите все его свойства в копию свойств вашего общего экземпляра.

+0

Я думал в этом направлении (похоже, у меня нет выбора из-за глубокой копии). В чем разница между этим и использованием 'NSCopying'? – Boaz

+0

ждать ... Моя одноточечно реализация '+ (идентификатор) Alloc { @synchronized ([класс MomentCreationShared]) { NSAssert (_sharedMySingleton == ноль, @ "Покушение выделить второй экземпляр одноточечного.") ; _sharedMySingleton = [super alloc]; return _sharedMySingleton; } return nil; } 'Как мне обойти это? – Boaz

+0

Это не то, как яблоко рекомендует делать синглтон. Вы можете сделать это следующим образом: '+ (id) sharedInstance { статический MySingleton * instance = nil; static dispatch_once_t onceToken; dispatch_once (& onceToken,^{ instance = [[self alloc] init]; }); экземпляр возврата; } ' – Drico

1

«Одноэлементный класс (объект), который фактически является структурой данных, доступ многих классов, а сингл»

Я думаю, что это легче сделать свой единичный объект, есть набор данных состав. Затем вы создаете копии структуры данных вместо копий singleton.

+1

Интересный ... немного переборщик (потому что он изменит всех клиентов, и в настоящее время мне нужно только одно отменить). Но мне нравится, что из коробки ... – Boaz

1

Одноэлементный шаблон появился в моде около 10 лет назад, когда образцы дизайна были впервые приняты разработчиками. В те годы, прошедшие с тех пор, синглтон попал в негодность, потому что, как известно, сложно провести фальсификацию в модульных тестах. Таким образом, самый простой ответ - полностью отказаться от модели singleton в пользу более дружественного шаблона.

Смежные вопросы