Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

2.2 Порождающие паттерны

Лекция



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

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

Для порождающих паттернов актуальны две темы. Во-первых, эти паттерны инкапсулируют знания о конкретных классах, которые применяются в системе. Во-вторых, скрывают детали того, как эти классы создаются и стыкуются. Единственная информация об объектах, известная системе, - это их интерфейсы, определенные с помощью абстрактных классов. Следовательно, порождающие паттерны обеспечивают большую гибкость при решении вопроса о том, что создается, то это создает, как и когда. Можно собрать систему из «готовых» объектов с самой различной структурой и функциональностью статически (на этапе компиляции) или динамически (во время выполнения). Иногда допустимо выбирать между тем или иным порождающим паттерном. Например, есть случаи, когда с пользой для дела можно использовать как прототип, так и абстрактную фабрику. В других ситуациях порождающие паттерны дополняют друг друга.

2.2.1    Паттерн Singleton

Название

Singleton (одиночка).

Задача

Для некоторых классов важно, чтобы существовал только один экземпляр. Хотя в системе может быть много принтеров, но возможен лишь один спулер. Должна быть только одна файловая система и единственная оконный менеджер. В ряде случае бухгалтерская система должна обслуживать только одну компания.

Как гарантировать, что у класса есть единственный экземпляр и что этот экземпляр легко доступен? Глобальная переменная дает доступ к объекту, но нее запрещает создания нескольких объектов класса. Более удачное решение – сам класс контролирует то, что у него есть только один экземпляр, может запретить создание дополнительных экземпляров, перехватывая запросы на создание новых объектов, и он же способен предоставить доступ к своему экземпляру. Это и есть назначение паттерна одиночка.

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

Структура

 2.2      Порождающие паттерны

 

Рисунок 2.1 Структура паттерна Singleton

Отношения

Клиенты получают доступ к экземпляру Singleton только через Singelton::getInstance()

Результаты

  • Гарантирует наличие в системе только одного экземпляра для некоторого класса.
  • Из-за того, что в языках программирования подобное поведение реализуется  через static методы, нельзя использовать полиморфизм.

2.2.2    Паттерн Prototype

Название

Prototype (прототип).

Назначение

Задает виды создаваемых объектов с помощью экземпляра-прототипа и создает новые объекты путем копирования этого прототипа.

Задача

Паттерн Prototype обеспечивает создание копии объекта без задания конкретного класса со стороны клиента. Используйте паттерн Прототип, когда существует необходимость создавать копии объектов не зная их конкретных типов, а зная только лишь базовый абстрактный тип.

Структура

 2.2      Порождающие паттерны

 

Рисунок 2.2 Структура паттерна Prototype

  • Prototype-Прототип: - объявляет интерфейс для клонирования самого себя;
  • СonсretePrototype  – конкретный прототип: - реализует операцию клонирования себя;
  • Client - клиент: - создает новый объект, обращаясь к прототипу с запросом клонировать себя.

 

Результаты

Преимущества применения прототипа таковы: во-первых, прототип позволяет получить новые объекты не задавая их конкретные классы; во-вторых, мы можем добавлять в систему новые классы за частую не изменяя клиента; в-третьих, мы скрываем от клиента названия конкретных классов (клиент знает только о классе Prototype) уменьшая тем самым степень связности клиента (то есть уменьшаем количество известных ему элементолв)

Среди недостатков можно отметить необходимость добавления в каждый конкретный класс реализации метода clone(), что может быть не всегда удобно.

2.2.3    Паттерн Factory method

Название

Factory method  (фабричный метод), Virtual constructor (виртуальный конструктор).

Назначение

Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс необходимо создать.

Мотивация

Каркасы пользуются абстрактными классами для определения и поддержания отношений между объектами. Об этом говорит сайт https://intellect.icu . Кроме того, каркас часто отвечает за создание самих объектов.

Рассмотрим каркас для приложений, способных представлять пользователю сразу несколько документов. Две основных абстракции в таком каркасе - это классы Application и Document. Оба класса абстрактные, поэтому клиенты должны порождать от них подклассы для создания специфичных для приложения реализаций. Например, чтобы создать приложение для рисования, мы определим классы DrawingApplication и DrawingDocument. Класс Application отвечает за управление документами и создает их по мере необходимости, допустим, когда пользователь выбирает из меню пункт Open (открыть) или New (создать).

 2.2      Порождающие паттерны

 

Рисунок 2.3 Структура паттерна Factory Method (пример)

Поскольку решение о том, какой подкласс класса Document необходимо создать зависит от приложения, то Application не может «предсказать», что именно понадобится. Этому классу известно лишь, когда нужно создавать новый документ, а не какой документ создать. Возникает дилемма: каркас должен создавать экземпляры классов, но знает он лишь об абстрактных классах, экземпляры которых создавать нельзя.

Решение предлагает паттерн фабричный метод. В нем инкапсулируется информация о том, какой подкласс класса Document создать, и это знание выводится за пределы каркаса.

Подклассы класса Application переопределяют абстрактную операцию CreateDocument таким образом, чтобы она возвращала подходящий подкласс класса Document. Как только подкласс Application создан, он может создавать специфические для приложения документы, ничего не зная об их классах. Операцию CreateDocument мы называем фабричным методом, поскольку она отвечает за «изготовление» объекта.

Применимость

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

Структура и участники

Структура паттерна представлена на рис. 2.4

  • Product (Document) - Продукт - определяет интерфейс объектов, создаваемых фабричным методом;
  • ConcreteProduct (MyDocument) - конкретный продукт:- реализует интерфейс Product;
  • Creator (Application) – создатель - объявляет фабричный метод, возвращающий объект типа Product. Creator может также определять реализацию по умолчанию фабричного метода.
  • ConcreteCreator (MyApplication) - конкретный создатель - замещает фабричный метод, возвращающий объект Concrete Product.

Отношения

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

Результаты

Фабричные методы избавляют проектировщика от необходимости встраивать в код зависящие от приложения классы. Код имеет дело только с интерфейсом класса Product, поэтому он может работать с любыми определенными пользователями классами конкретных продуктов. Потенциальный недостаток фабричного метода состоит в том, что клиентам, возможно, придется создавать подкласс класса Creator для создания лишь одного объекта ConcreteProduct. Порождение подклассов оправдано, если клиенту так или иначе приходится создавать подклассы Creator, в противном случае клиенту придется иметь дело с дополнительным уровнем подклассов.

 2.2      Порождающие паттерны

 

Рисунок 2.4 Структура паттерна Factory Method

2.2.4    Паттерн Reflection

Название

Reflection

Назначение

Обеспечить возможность создание объектов по имени класса для языков программирования, не поддерживающих рефлексию явно.

Структура и участники

 2.2      Порождающие паттерны

 

Рисунок 2.5 Структура паттерна Рефлексия

  • Object. Базовый класс для всех классов системы, для которых необходимо создание объектов по имени. В простейшем случае объявляет интерфейс с одним абстрактным методом createInstance().
  • ConcreteClass1. Конкретный подкласс Object. Реализует метод createInstance(). Наиболее очевидной реализацией этого метода в конкретных подклассах Object является создание самого себя .
  • ObjectFactory. Фабрика объектов. Реализуется в соответствии с шаблоном Singleton. Данный класс предоставляет интерфейс для регистрации классов (registerClass())  и для создания объектов (createObjectByName())
  • Library. Предоставляет абстрактный интерфейс для модулей системы. Конкретными подклассами Library могут являться классы, инкапсулирующие загрузку динамических библиотек, таких как Dynamic LoadLibrary (DLL) в Win32-системах или Shared Library  в Unix-системах. В задачу данного класса входит регистрация содержащихся в них классов у ObjectFactory (рис. 2.6)
  • Client. Описывает классы, объекты которых являются клиентами относительно ObjectFactory. Клиенты используют ObjectFactory для создания объектов вызывая у последней createObjectByName() (рис. 2.7)

 

Взаимодействие

 2.2      Порождающие паттерны

 

Рисунок 2.6 Регистрация класса

2.2      Порождающие паттерны 

Рисунок 2.7 Создание объекта

 

Результаты

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

2.2.5    Паттерн Creator

Название

Creator (Создатель)

Назначение

Определяет, кто должен отвечать за создание объектов.

Решение

Назначить классу В обязанность создавать экземпляры класса А если выполняется одно из следующих условий.

  • Класс В агрегирует (aggregate) объекты А.
  • Класс В активно использует (closely uses) объекты А.
  • Класс В обладает данными инициализаци, которые будут передаваться объектам А при их создании.

Результаты

Поддерживается шаблон Low Coupling, способствующий снижению затрат на сопровождение и обеспечивающий возможность повторного использования созданных компонентов в дальнейшем.

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

создано: 2014-10-05
обновлено: 2021-03-13
132562



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Объектно-ориентированное программирование ООП

Термины: Объектно-ориентированное программирование ООП