Patterns

Creational Design Patterns

Немного ясности в структуру паттернов :

Daria Korneichuk
iOS Developer

Сегодня возьмем Creational — типы или «порождающие». Все примеры на Swift 3.0
    1. Прототип
    – простой паттерн, который позволяет получить точную копию необходимого объекта. То есть использовать как прототип для нового объекта

    Когда использовать:

    1. У нас есть семейство схожих объектов, разница между которыми только в состоянии их полей;

    2. Не хотим писать иерархию фабрик, которые будут инкапсулировать всю противную работу создания объекта.

    Поверхностное и глубокое копирование :

    Есть указатель — есть значение в куче.

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

    Для примера создадим класс Person, реализуем init-метод и удобный description.

    Создаем два объекта, делаем копирование и смотрим в консоль:

    Хоть и меняли мы имя для secondPerson, но и у firstPerson имя поменялось. Просто потому что мы создали два указателя на один и тот же объект.
    Глубокое копирование позволит получить два разных объекта.

    Для этого в классе Person нужно подписаться на протокол NSCopying и реализовать метод copyWithZone:

    Теперь, мы можем создать два объекта, и второй скопировать из первого, вызвав этот метод.
    2. Фабричный метод

    В системе часто требуется создавать объекты самых разных типов. Паттерн Factory Method может быть полезным в решении следующих задач:

    • Система должна оставаться расширяемой путем добавления объектов новых типов. Паттерн Factory Method позволяет системе оставаться независимой как от самого процесса порождения объектов, так и от их типов.
    • Заранее известно, когда нужно создавать объект, но неизвестен его тип.

    Давайте представим ситуацию : мы хотим купить беспроводную колонку. Для простоты примера предположим, что в магазине есть только Beats и Bowers & Wilkins. Создадим класс Speaker. От него унаследуем модели Pill и T7.
    Ну теперь мы подошли вплотную к нашему паттерну.


    Нам нужен консультант в магазине, который будет подбирать стереосистему в зависимости от располагаемых денег, создаем новый класс.

    Ну вот собственно и все. Теперь просто создадим метод, который будет играть музыку с купленного девайса:
    В консоли:
    3. Абстрактная фабрика

    Абстрактная фабрика – еще один очень популярный паттерн, который как и в названии так и в реализации похож на (или даже включает в себя) фабричный метод.

    Абстрактная фабрика дает простой интерфейс для создания объектов которые принадлежат к тому или иному семейству объектов.

    Пример использования здесь

    4. Строитель

    Когда использовать:

    1. Создание сложного объекта
    2. Процесс создания объекта тоже очень не тривиальный – к примеру получение данных из базы и манипуляция ими.

    Сам паттерн состоит из двух компонент – Bulilder и Director. Builder занимается именно построением объекта, а Director знает какой Builder использовать чтобы выдать необходимый продукт.

    Замечательный пример использования паттерна

    5. Синглтон


    — это такой объект, который существует в системе в единственном экземпляре. Очень часто используется для хранения каких-то глобальных переменных, например, встроенный NSUserDefaults.

    iOS сам за нас позаботится о том, чтобы создан был только один экземпляр нашего объекта. Собственно dispatch_once делает всю работу – он синхронный:) Потому, ни один поток не может зайти в этот код, пока он занят и это гарантирует, что объект будет существовать в одном экземпляре.
    Для свифта все ещё проще, можно обойтись без GCD:
    Made on
    Tilda