Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Синглтон (Перевод с английского главы «Singleton» из книги «Pro Objective-C Design Patterns for iOS» Carlo Chung)

Anna | 2.07.2014 | нет комментариев

В математике и логике синглтон определяется как «уйма, содержащее ровно один элемент». Следственно неважно, насколько крупна сумка, всякий раз при попытке достать из неё шар будем получать один и тот же. В каких обстановках необходим синглтон в программировании? Подумайте о источниках, которые немыслимо скопировать, но дозволено применять коллективно. Скажем, на iPhone установлен исключительный модуль GPS и определять нынешние координаты может только он. Класс CLLocationManager из фреймворка CoreLocation предоставляет исключительную точку входа ко каждому сервисам GPS-модуля. Кто-нибудь может подумать: если дозволено сделать копию CLLocationManager, дозволено ли получить добавочный комплект GPS-сервисов для своего приложения? Это звучит, как фантастика – вы сотворили два программных GPS по цене одного аппаратного. Но в действительности вы все равно получаете только один GPS одновременно, так как в iPhone есть только один GPS, тот, что создает реальные соединения со спутниками. Так что, если вы думаете, что сотворили супер-приложение, которое может манипулировать двумя отдельными GPS-соединениями единовременно, и хотите похвастаться этим перед друзьями, подумайте двукратно.

Класс синглтона в объектно-ориентированном приложении неизменно возвращает один и тот же экземпляр самого себя. Он обеспечивает глобальную точку доступа для источников, которые предоставляет объект класса. Паттерн с такой функциональностью именуется Синглтон.
В этой главе мы изучим вероятности реализации и применения паттерна Синглтон в Objective-C и фреймворке Cocoa Touch на iOS.

Что из себя представляет паттерн Синглтон?

Паттерн Синглтон – едва ли не самый примитивный из паттернов. Его предназначение в том, Дабы сделать объект класса исключительным экземпляром в системе. В первую очередь необходимо запретить создавать больше одного экземпляра класса. Для этого дозволено применять фабричный способ (глава 4), тот, что должен быть статическим, так как не имеет смысла разрешать экземпляру класса создавать иной исключительный экземпляр. Рисунок 7-1 показывает конструкцию класса простого синглтона.

image
Рисунок 7-1. Статическая конструкция паттерна Синглтон.

Статический uniqueInstance – это исключительный экземпляр класса Singleton, представленный в виде переменной класса, которую статический способ sharedInstance вернет заказчикам. Обыкновенно sharedInstance будет проверять, инстанцирован ли uniqueInstance. Если нет, способ сделает его перед возвратом.

Примечание. Паттерн Синглтон: Проверяет, что есть только один экземпляр класса и обеспечивает цельную точку доступа к нему.*
*Исходное определение, представленное в «Design Patterns» GoF (Addison-Wesley,
1994).

Когда дозволено применять паттерн Синглтон?

Есть толк подумать об применении паттерна Синглтон, если:

  • В системе может быть только один экземпляр класса, тот, что должен быть доступен через отлично знаменитую точку доступа, скажем, фабричный способ.
  • Исключительный экземпляр может быть расширен только путем наследования, и клиентский код не утратит работоспособность от применения расширенного объекта.

Паттерн Синглтон обеспечивает знакомый метод создания неповторимого экземпляра с комфортным методом доступа к разделяемому источнику. Способ применения ссылки на статический всеобщий объект не предотвращает создание иного экземпляра того же класса. Подход применения способа класса, правда и может предоставить глобальную точку доступа, но ему недостает эластичности распределения кода.
Статическая глобальная переменная содержит исключительную ссылку на экземпляр класса. Иной класс либо способ, которые имеют к ней доступ, реально разделяют ту же самую копию с другими классами либо способами, использующими ту же переменную. Схоже на то, что нам необходимо. Все выглядит восхитительно, пока применяется та же самая глобальная переменная по каждому приложению. Таким образом, реально, паттерн Синглтон не необходим. Но подождите! Что, если кто-то в вашей команде определил в коде такую же глобальную переменную, как ваша? Тогда будет две копии одного и того же глобального объекта в одном приложении – следственно глобальная переменная на самом деле не решает задачу.

Способ класса предоставляет вероятность распределения без сsuper, следственно класс NSObjectпозаботится о выделении памяти под объект. Если мы наследуемся от класса Singleton без модификаций, то возвращаемый экземпляр неизменно будет типа Singleton. От того что класс Singleton переопределяет все относящиеся к созданию экземпляра способы, достаточно сложно наследовать от него. Но нам повезло; дозволено применять некоторые функции Foundation для инстанцирования всякого объекта, базируясь на его типе класса. Одна из них – это id NSAllocateObject (Class aClass, NSUInteger extraBytes, NSZone *zone). Следственно, если мы хотим инстанцировать объект класса, именующийся «Singleton», дозволено сделать следующее:

Singleton *singleton = [NSAllocateObject ([Singleton class], 0, NULL) init];

1-й параметр – это тип класса Singleton. 2-й параметр предуготовлен для всякого числа дополнительных байт для индексированных переменных экземпляра, тот, что неизменно равен 0. 3-й параметр – обозначение зоны выделяемой памяти; примерно неизменно применяется зона по умолчанию (параметр равен NULL). Следственно дозволено инстанцировать всякие объекты, применяя эту функцию, зная тип класса. Что необходимо делать для наследования от класса Singleton? Давайте припомним, что первоначальный вариант способа sharedInstance выглядит так:

  (Singleton*) sharedInstance
{
    if (sharedSingleton_ == nil)
    {
        sharedSingleton_ = [[super allocWithZone:NULL] init];
    }
    return sharedSingleton_;
}

Если применять трюк с NSAllocateObject для создания экземпляра, то он станет таким:

  (Singleton *) sharedInstance
{
    if (sharedSingleton_ == nil)
    {
        sharedSingleton_ = [NSAllocateObject([self class], 0, NULL) init];
    }
    return sharedSingleton_;
}

Сейчас неважно, инстанцируем ли мы класс Singleton либо какой-то из его подклассов, эта версия сделает все правильно.

Потокобезопасность

Класс Singleton в примере классен только для всеобщего применения. Если необходимо применять объект синглтона в многопоточной среде, то нужно сделать его потокобезопасным. Для этого дозволено вставить блоки @synchronized() либо применять экземпляры NSLock вокруг проверки на nil для статической переменной экземпляра sharedSingleton_. Если есть какие-то другие свойства, которые тоже необходимо защитить, то дозволено сделать их atomic.

Применение Синглтонов во фреймворке Cocoa Touch

В процессе знакомства с документацией Cocoa Touch Framework вам встретится много различных классов синглтонов. Мы побеседуем о некоторых из них в этом разделе — UIApplicationUIAccelerometer иNSFileManager.

Применение класса UIApplication

Одним из особенно Зачастую используемых синглтон классов во фреймворке является класс UIApplication. Он обеспечивает централизованную точку управления и координирования для iOS-приложений.

Всякое приложение имеет исключительный экземпляр UIApplication. Он создается как синглтон объект функцией UIApplicationMain при запуске приложения и доступен во время выполнения через способ классаsharedApplication.

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

Применение класса UIAccelerometer

Иной общеизвестный синглтон во фреймворке Cocoa Touch – это UIAccelerometer. Класс UIAccelerometerразрешает приложению подписаться на приобретение связанных с акселерацией данных из встроенного акселерометра в iOS-устройстве. Приложение может применять данные по изменениям линейной акселерации по основным осям в трехмерном пространстве для определения и нынешней ориентации устройства, и мгновенных изменений в ориентации.
Класс UIAccelerometer является синглтоном, следственно невозможно создавать его объекты очевидно. Для доступа к его исключительному экземпляру необходимо вызывать способ класса sharedAccelerometer. Помимо того, дозволено установить его качество updateInterval и качество delegate в свой личный объект делегата для приобретения всяких отчетных данных по акселерации от экземпляра синглтона.

Применение класса NSFileManager

Класс NSFileManager когда-то был «суровой» реализацией паттерна Синглтон перед Mac OS X 10.5 и в iOS 2.0. Вызов его способа init ничего не делает, и его исключительный экземпляр может быть сделан и доступен только через способ класса defaultManager. Впрочем от того что синглтон реализация не является потокобезопасной, то доводится создавать новые экземпляры NSFileManager, Дабы обеспечить эту безопасность. Данный подход рассматривается как больше эластичная реализация Синглтона, в которой фабричный способ неизменно возвращает один и тот же экземпляр, но дозволено выделить и инициализировать также добавочные экземпляры.

Если необходимо реализовать «суровый» синглтон, нужна реализация, схожая на пример, описанный в предыдущих разделах. Напротив – не переопределяйте allocWithZone: и другие связанные способы.

Итоги

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

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB