Синглтоны, как следует из названия, должны использоваться, когда в вашем приложении должен быть ровно один объект . Шаблон для метода доступа обеспечивает только это требование, являющееся методом класса:
+ (MyClass*) sharedInstance
{
static MyClass *instance = nil;
if (instance == nil) instance = [[MyClass alloc] init];
return instance;
}
При правильной реализации класс также гарантирует, что его конструктор является закрытым, поэтому никто не может создать экземпляр класса, кроме метода доступа: это гарантирует, что в любой момент существует не более одного экземпляра класса. Лучший пример такого класса - UIApplication
, поскольку в любой момент может быть только один объект этого класса.
Дело в том, что это единственное требование к синглтону. Роль метода доступа заключается в том, чтобы гарантировать, что существует только один экземпляр, а не в том, что он обеспечит доступ к этому экземпляру из любого места. Это всего лишь побочный эффект паттерна, когда метод доступа является статическим, каждый может получить доступ к этому единственному объекту, не имея априорной ссылки (указателя) на него. К сожалению, этот факт широко используется программистами Objective C, и это приводит к путанице в дизайне и ненависти к шаблону синглтона, который вы упомянули. Но в общем-то, это не ошибка одиночного шаблона, а неправильное использование метода доступа.
Теперь вернемся к вашему вопросу: если вам не нужны статические / глобальные переменные в вашем пользовательском коде перехода (я полагаю, вам это не нужно), тогда ответ определенно идет на категории. В C ++ вы бы создали подкласс из некоторого родительского класса BaseTransition и реализовали бы свои настоящие методы рисования. В Objective C есть категории (что, на мой взгляд, является еще одним способом, который легко портит дизайн, но они гораздо удобнее), где вы можете добавлять пользовательские функции, даже обращаясь к переменным вашего хост-класса. Используйте их всякий раз, когда вы можете использовать синглтоны вместе с ними, и не используйте синглтоны, если главное требование к вашему классу не в том, чтобы это был только один его экземпляр.