iPhone: статический метод против sharedManager в Objective-C

У меня есть несколько функций, которые возвращают обычно используемые UIViews в моем приложении, например.

+ (UIView *) getLikeRow:(CGRect) frame ofType:(LikeType) type

До сих пор я использовал для этого статические методы, но недавно я также заметил концепцию sharedManager. Теперь мне интересно, лучше ли мне использовать sharedManager для этого.

Каковы различия и преимущества / недостатки использования статических методов по сравнению с методами экземпляра синглтона sharedManager?


person znq    schedule 03.05.2010    source источник
comment
возможный дубликат stackoverflow.com/questions/46541/   -  person kennytm    schedule 03.05.2010
comment
Не думаю, что это дубликат. Вопрос о дизайне имеет тонкое, но важное отличие от предыдущего вопроса.   -  person TechZen    schedule 03.05.2010
comment
Спасибо, Кенни, что указал на аналогичный вопрос.   -  person znq    schedule 03.05.2010


Ответы (1)


Вы используете шаблон singleton / shared-managed, когда важно, чтобы в любой момент времени был активен только один экземпляр класса.

Например, важно, чтобы приложение имело один и только один экземпляр UIApplication. Вам понадобятся два экземпляра объекта приложения, потому что невозможно сохранить их оба в одном и том же состоянии. NSFileManager использует шаблон, чтобы предотвратить столкновение двух файловых операций в приложении.

Применение уникального экземпляра во время выполнения - единственная веская причина для использования шаблона singleton / shared-managed.

В вашем случае вам просто нужно удобное место для парковки некоторых методов служебного класса, которым не требуется живой экземпляр для работы. Лучший способ справиться с этим - создать служебный класс, который объединяет все методы класса вместе. Затем, чтобы использовать методы, вы просто отправляете имя класса следующим образом:

UIView *theView=[MyViewUtilityClass getLikeRow:aRect ofType:aType];

Это заставляет MyViewUtilityClass вызывать метод из любого места приложения без необходимости инициализировать объект. Это проще и аккуратнее, чем поддерживать в живых уникальный экземпляр. Если вы используете служебные методы во всем приложении, вы можете добавить заголовок в универсальный заголовок .pch, и все ваши пользовательские классы автоматически получат служебный класс.

Однако, как и в случае с одноэлементным шаблоном, методы служебного класса могут склонить вас к лени и чрезмерному использованию их там, где им на самом деле не место. При чрезмерном использовании они начинают делать приложение похожим на старую школу, не объектно-ориентированную коллекцию независимых функций Си. Это нарушает инкапсуляцию и модульность и превращает вашу программу в клубок процедурного кода.

Итак, будьте осторожны, вы помещаете в служебный класс только самые общие и универсальные функции. Если у вас есть много функций, которые имеют дело с определенным классом, например UIView и подклассы, вам следует поместить функции в категорию этого класса.

person TechZen    schedule 03.05.2010
comment
Имеет смысл. Спасибо за очень подробный и полезный ответ. - person znq; 03.05.2010