Evgenii Legotckoi
Evgenii Legotckoi17 вересня 2018 р. 05:37

Шаблони проектування, що породжують - Фабричний метод

Голи

  • Визначаємо інтерфейс для створення об'єкта, але нехай підкласи вирішують який клас слід створювати. Фабричний метод дозволяє створити екземпляр класу для підкласів.
  • Визначення «віртуального» конструктора.
  • Оператор new є шкідливим.

Проблеми

Структура проекту повинна стандартизувати архітектурну модель для цілого ряду додатків, але дозволяє окремим додаткам визначати власні об'єкти і забезпечувати власні правила їх створення при збереженні однакового інтерфейсу створення об'єктів.


Обговорення

Фабричний метод полягає у створенні об'єктів як шаблонний метод для реалізації алгоритму створення об'єктів. Суперклас визначає всю стандартну та загальну поведінку (використовуючи чисті віртуальні «методи» для реалізації етапів створення об'єкта), а потім делегує деталі створення об'єкта в підкласи, які надаються клієнтам.

Фабричний метод робить дизайн додатків більш налаштованим і лише трохи складнішим. Інші шаблони проектування вимагають нових класів, тоді як Factory Method потрібна лише нова операція.

Люди часто використовують Factory Method як стандартний спосіб створення об'єктів; але це необов'язково, якщо: екземпляр класу, який був створений, ніколи не змінюється або створюється екземпляр в операції, яку підкласи можуть легко перевизначити (наприклад, операцію ініціалізації).

Фабричний метод схожий на абстрактну фабрику, але без акценту на сімейство об'єктів.

Фабричні методи зазвичай визначаються архітектурним середовищем, та був реалізуються користувачем структури.

Структура

Реалізація Фабричного методу, що обговорюється в "Банді Чотирьох", значною мірою збігається з реалізацією Abstract Factory. З цієї причини у презентації у цій статті основна увага приділяється підходу, який став популярним відтоді.

Все популярнішим визначенням фабричного методу є статичний метод класу, який повертає об'єкт типу цього класу. Але на відміну від конструктора фактичний об'єкт, який він повертає, може бути екземпляром підкласу. На відміну від конструктора, існуючий об'єкт може бути використаний повторно замість нового створеного об'єкта. На відміну від конструктора, фабричні методи можуть мати різні і більш описові імена (наприклад, Color.make_RGB_color (float red, float green, float blue) та Color.make_HSB_color (float hue, float saturation, float brightness).

Клієнт повністю відокремлений від деталей реалізації похідних класів. Тепер можливе використання поліморфізму.

Приклад

Фабричний метод визначає інтерфейс створення об'єктів, але дозволяє підкласам вирішувати, які класи слід створювати. Прес-форми для лиття під тиском показують цю закономірність. Виробники пластикових іграшок обробляють пластиковий порошок і впорскують пластик у форми з бажаними характеристиками. Клас іграшок (автомобіль, фігурка тощо. буд.) визначається формою.

Контрольний список

  1. Якщо у вас є ієрархія спадкування, яка виконує поліморфізм, розгляньте можливість додавання можливості створення поліморфних об'єктів шляхом визначення статичного фабричного методу у базовому класі.
  2. Розробіть аргументи для фабричного методу. Які якості чи характеристики необхідні та достатні для ідентифікації правильного похідного класу для створення екземпляра?
  3. Подумайте про створення внутрішнього пулу об'єктів, який дозволить повторно використовувати об'єкти замість створення з нуля.
  4. Подумайте про те, щоб зробити всі конструктори private або protected

Емпіричні правила

  • Класи Abstract Factory часто реалізуються за допомогою Factory Methods, але вони можуть бути реалізовані за допомогою Prototype.
  • Фабричні методи зазвичай викликаються у шаблонних методах.
  • Factory Method: створення через успадкування. Prototype: створення через делегування.
  • Часто проекти починаються з використання Factory Method (менш складні, настроювані, підкласи розмножуються) і розвиваються в напрямку Abstract Factory, Prototype або Builder (гнучкіші, складніші), оскільки розробник виявляє, що потрібно більше гнучкості.
  • Prototype не вимагає підкласів, але для цього потрібна операція ініціалізації. Factory Method потребує підкласифікації, але не вимагає ініціалізації.
  • Перевага Factory Method полягає в тому, що він може повертати той самий екземпляр кілька разів або може повертати підклас, а не об'єкт цього точного типу.
  • Деякі прихильники фабричного методу рекомендують, щоб у плані мовного дизайну (або, якщо не брати до уваги цього, в стилі) абсолютно всі конструктори повинні бути приватними або захищеними.
  • Оператор new вважається шкідливим. Існує різниця між запитом об'єкта та його створенням. Оператор new завжди створює об'єкт і не може інкапсулювати створення об'єкта. Factory Method застосовує цю інкапсуляцію і дозволяє вимагати об'єкт без нерозривного зв'язку з актом створення.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах