Шаблони дизайну - Швидкий посібник по абстрактній фабриці.

Це швидкий посібник для освоєння однієї з найбільш часто використовуваних моделей дизайну, «Фабрика абстрактних». Незважаючи на те, що приклади кодування будуть в C ++, оскільки мені це зручніше, їх можна легко налаштувати на будь-яку мову програмування, як Java, Python, C #, Javascript та інше.

Анотація Фабрика класифікується у моделях креативного дизайну, що стосується інстанцій класу / об'єкта. Точніше, як ефективно використовувати успадкування (шаблони створення класів) або делегування (шаблони створення об'єктів). [за шаблонами дизайну пояснено просто]

Визначення фабрики: "Це будівля або група будівель, де продукція виготовляється / створюється". Потім товари надсилаються клієнтам для використання на власну відповідальність. У той же час, клієнтів на заводі багато, клієнтам повинно бути досить легко замовити свій товар і аналогічно легко адаптувати завод відповідно до потреб клієнта.

Підключимо точки для розуміння цієї схеми дизайну. Ми використовуємо його, коли нам потрібен інтерфейс для створення залежних об'єктів, не обов'язково вказуючи їх конкретні класи. У той же час ми хочемо інкапсулювати побудову «продуктів», використовуючи спадкування.

Крок 1 - Ключові слова

Визначення ключових слів - секретний рецепт у цій серії швидких посібників. Цей метод допоміг мені по-справжньому зрозуміти шаблони дизайну, важко кодувати їх у думках і зрозуміти відмінності між іншими моделями дизайну.

  1. Продукт: Це об'єкт, побудований заводом, і він включений до сімейства об'єктів. Він дуже специфічний, оскільки немає абстракції до нього. Приклад: BMWdoorHandle, FordDoorHandle.
  2. Абстрактний продукт: Це вигляд продукту вищого рівня, який визначає його родину. Приклад DoorHandle, DoorWindow
  3. Бетонна фабрика: це фабрика, яка "фізично" мікро-керує створенням та комплектуванням виробу. Приклад: BMWFactory, FordFactory.
  4. Анотація заводу: це інтерфейс для створення сімей пов’язаних або залежних об'єктів без зазначення їх конкретних класів. Приклад: CarFactory

Крок 2 - Діаграма

Під час обговорення абстрактного заводу все повинно відповідати ключовим словам, наведеним вище. Якщо код починає відходити від цих слів, то, ймовірно, щось не зовсім правильно. Давайте зробимо це простим, Бетонна фабрика успадковує компанію «Абстрактний завод», а «Продукт - від абстрактного продукту». Діаграма така просто, як виглядає; два класи, що успадковують від своїх абстрактних класів. Бетонна фабрика - це та, яка повинна виконувати брудну роботу для створення конкретних виробів (що визначається червоною лінією). Тепер за допомогою цієї діаграми легко зрозуміти, що цю модель дизайну можна легко оновити, додавши більше конкретних заводів та більше продукції, тобто ProductC, ProductD тощо.

Крок 3 - Код за прикладом

Я б запропонував скопіювати клас коду за класом з мого сховища git "Andreas Poyias" і вставити його в будь-який онлайн-редактор C ++, як оболонка c ++, jdoodle або onlineGDB або будь-який інший і запустити його для спостереження за результатами. Потім прочитайте коментарі чи опис нижче. Назви класів записуються так, що після підкреслення я даю ключове слово, пов'язане з ним.

AbstractProduct
Абстрактний продукт - це абстрактний клас, і, як очікується, він визначає родину продуктів, які успадковують його. У цьому прикладі абстрактний продукт є aDoorHandle, я додав функцію, яка щось друкує для цілей демонстрації.

#include 
клас DoorHandle_Ab абстрактProduct
{
загальнодоступний:
 // Манекенна функція, яка щось друкує
 віртуальний недійсний printSerialNumber () = 0;
};

Товар
У цьому прикладі продукція - дверна ручка BMW або Ford. Вони мають різні серійні номери, тому кожен клас може надрукувати власний серійний номер продукту. Ми також могли мати дверіWindoworSteeringWheel. Класи ручки дверей успадковуються від абстрактного класу вище.

// Дверна ручка BMW [у родині дверних ручок]
клас BMWDoorHandle_Product: загальнодоступна дверна ручка_Ab абстрактProduct
{
загальнодоступний:
    // Друкує серійний номер для продукту
    void printSerialNumber () {
        std :: cout << "DoorHandle_Product: BMW123 \ n";
    }
};
// Дверна ручка Ford [у сімействі дверних ручок]
клас FordDoorHandle_Product: загальнодоступна дверна ручка_Ab абстрактProduct
{
загальнодоступний:
    // Друкує серійний номер для продукту
    void printSerialNumber () {
        std :: cout << "DoorHandle_Product: Ford123 \ n";
    }
};

AbstracFactory
 Це дуже загальний / абстрактний клас, який не повинен мати набагато більше, ніж функція створення. Зрештою, фабрика просто створює продукцію.

клас Car_Ab AbstractFactory
{
загальнодоступний:
 віртуальний DoorHandle_Ab абстрактProduct * createDoorHandle () = 0;
 // віртуальний DoorWindow_Ab абстрактProduct * createDoorWindow () = 0;
};

Бетонний завод
Цей заводський клас досить специфічний для продукту. Саме працьовик складає головоломку. У цьому прикладі він характерний для марки {BMW, Ford}. Його завдання - повернути екземпляр товару, який є специфічним для цієї марки. Знову ж таки, якби ми хотіли створитиBMWDoorWindow, ми могли б насправді створити нову функцію, яка повертає екземпляр відповідного абстрактного класу. У моєму сховищі git є також повна реалізація і з частинами TheDoorWindow.

клас BMWCar_ConcreteFactory: громадський автомобіль_АбстрактнийФактор
{
загальнодоступний:
    DoorHandle_Ab абстрактProduct * createDoorHandle () {
        повернути новий BMWDoorHandle_Product;
    }
};
клас FordCar_ConcreteFactory: загальнодоступний автомобіль_АбстрактнийФактор
{
загальнодоступний:
    DoorHandle_Ab абстрактProduct * createDoorHandle () {
        повернути новий FordDoorHandle_Product;
    }
};

Основна функція
Нарешті, це останній фрагмент коду. Основна функція, яка функціонує як клієнт. Клієнт може легко «замовити» продукцію на заводі і може використовувати їх будь-яким способом, який йому подобається.

int main ()
{
    // Клієнту потрібні дверна ручка та двері
    Car_Ab абстрактFactory * AbstractFactory;
    DoorHandle_Ab абстрактProduct * dHandle_Ab абстрактProduct;
 
    // Клієнту потрібні товари марки Ford
    AbstractFactory = новий FordCar_ConcreteFactory;
    // Бетонний завод Ford створює їх
    // і повертає їх клієнту
    dHandle_Ab абстрактProduct = AbstractFactory-> createDoorHandle ();
    // Клієнт використовує продукцію
    dHandle_Ab абстрактProduct -> printSerialNumber ();
    // Тепер клієнт хоче продуктів, але від марки BMW
    AbstractFactory = новий BMWCar_ConcreteFactory;
    // Так створює їх бетонна фабрика BMW
    // і повертає їх клієнту
    dHandle_Ab абстрактProduct = AbstractFactory-> createDoorHandle ();
    // Клієнт використовує продукцію
    dHandle_Ab абстрактProduct -> printSerialNumber ();
повернути 0;
}
// Вихід
// DoorHandle_Product: Ford123
// DoorHandle_Product: BMW123

Переваги можуть бути не очевидними. Але уявіть на секунду, скільки продуктів має автомобіль і скільки речей може зробити фабрика автомобілів. Тепер уявіть, що хаос підтримує погано розроблений код кожного разу, коли BMW вирішить змінити ручку дверей. Додайте новий тип водійського сидіння або навіть щось поміняйте в двигуні. Тепер, додавши складності, уявіть, що ці проблеми зберігаються, але для кількох брендів. Анотація заводу пропонує бездоганний та чистий підхід, який можна використовувати протягом наступних років. Новому розробнику буде важко зіпсувати і так легко додати / видалити новий продукт.

Абстрактна фабрика - лише початок цієї подорожі. Це одна з найбільш часто використовуваних моделей дизайну, і багато разів вона використовується в поєднанні з іншими моделями дизайну. Наступним блогом буде короткий посібник щодо дизайну Singleton. Не забувайте сподобатися моєму блогу та слідкувати за моїм обліковим записом. Це дає мені задоволення, що я допоміг деяким колегам-розробникам і змусив мене продовжувати писати.

Інші швидкі посібники щодо моделей дизайну:

  1. Шаблони дизайну - Швидкий посібник по абстрактній фабриці.
  2. Шаблони дизайну - Швидкий посібник із мостового шаблону.
  3. Шаблони дизайну - Швидкий посібник щодо шаблону для будівельників.
  4. Шаблони дизайну - Швидкий посібник з візерунком декораторів.
  5. Шаблони дизайну - Швидкий посібник з фасадної схеми.
  6. Шаблони дизайну - Швидкий посібник із шаблону спостерігачів.
  7. Шаблони дизайну - Швидкий посібник по Singleton Pattern.