Modele de proiectare - Un ghid rapid pentru Abstract Factory.

Acesta este un ghid rapid pentru stăpânirea unuia dintre cele mai utilizate modele de design, Abstract Factory. Chiar dacă exemplele de codare vor fi în C ++, deoarece sunt mai confortabil, ele pot fi adaptate cu ușurință la orice limbaj de programare precum Java, Python, C #, Javascript și multe altele.

Abstract Factory este clasificată în tiparele de creație creațională, care se referă la instantanarea clasei / obiectului. Mai precis, modul de utilizare eficientă a moștenirii (tipare de creare a clasei) sau a delegării (modele de creare a obiectelor). [după modelele de design explicate simplu]

Definiția fabricii: „Este o clădire sau un grup de clădiri în care produsele sunt fabricate / create”. Produsele sunt apoi trimise clienților pentru a fi utilizate pe propria răspundere. În același timp, clienții din fabrică sunt mulți, ar trebui să fie destul de ușor pentru clienți să își comande produsul și, în același timp, ușor să se adapteze în funcție de nevoile clientului.

Să conectăm punctele pentru a înțelege acest model de design. O folosim atunci când avem nevoie de o interfață pentru crearea obiectelor dependente, fără a specifica neapărat clasele lor concrete. În același timp, dorim să încapsulăm construcția „produselor” folosind moștenire.

Pasul 1 - Cuvinte cheie

Definirea cuvintelor cheie este rețeta secretă din această serie de ghiduri rapide. Această metodă m-a ajutat să înțeleg cu adevărat modelele de design, să le codează în minte și să înțeleg diferențele dintre alte modele de design.

  1. Produs: este un obiect construit de o fabrică și este inclus într-o familie de obiecte. Este foarte specific, deoarece nu există nicio abstractizare. Exemplu: BMWdoorHandle, FordDoorHandle.
  2. Produs abstract: Este o vedere la un nivel mai înalt a unui produs care definește familia sa. Exemplu DoorHandle, DoorWindow
  3. Beton Factory: Este o fabrică care „fizic” micro-gestionează crearea și finalizarea unui produs. Exemplu: BMWFactory, FordFactory.
  4. Abstract Factory: este o interfață pentru crearea familiilor de obiecte conexe sau dependente, fără a specifica clasele lor concrete. Exemplu: CarFactory

Pasul 2 - diagrama

Când discutăm despre Abstract Factory, totul ar trebui să fie relevant pentru cuvintele cheie de mai sus. Dacă codul începe să se abată de la aceste cuvinte, probabil că ceva nu este chiar corect. Să facem că această simplă fabrică de beton este moștenire de la Abstract Factory și Produs de la Abstract Product. Diagrama este la fel de simplă pe cât arată; două clase moștenind din clasele lor abstracte. Fabrica de beton este cea care face lucrările murdare pentru a crea produse specifice (care este identificată prin linia roșie). Acum, cu această diagramă, este ușor de înțeles că acest model de proiectare poate fi ușor actualizat prin adăugarea mai multor fabrici de beton și a mai multor produse, adică ProductC, ProductD etc.

Pasul 3 - Cod de exemplu

Aș sugera să copiez clasa de cod pe clasă din depozitul meu de git „Andreas Poyias” și să-l lipiți în orice editor C ++ online, cum ar fi c ++ shell, jdoodle sau onlineGDB sau oricare altul și să-l executați pentru a observa rezultatul. Apoi citiți comentariile sau descrierea de mai jos. Numele clasei sunt scrise astfel încât după subliniere dau cuvântul cheie aferent.

AbstractProduct
Produsul abstract este o clasă abstractă și, așa cum era de așteptat, definește o familie de produse care moștenesc de la el. În acest exemplu, produsul abstract este aDoorHandle, am adăugat o funcție care tipărește ceva în scopul prezentării.

#include 
clasa DoorHandle_AbstractProduct
{
public:
 // O funcție falsă care tipărește ceva
 virtual void printSerialNumber () = 0;
};

Produs
În acest exemplu, produsele sunt mânerul ușii BMW sau Ford. Au numere de serie diferite, prin urmare, fiecare clasă își poate imprima propriul număr de serie specific produsului. Am putea avea și DoorWindoworSteeringWheel. Clasele mânerului ușii moștenesc din clasa abstractă de mai sus.

// Mânerul ușii BMW [în familia ușilor]
clasa BMWDoorHandle_Product: public DoorHandle_AbstractProduct
{
public:
    // Tipărește numărul de serie specific produsului
    void printSerialNumber () {
        std :: cout << "DoorHandle_Product: BMW123 \ n";
    }
};
// Mânerul ușii Ford [în familia ușilor]
clasa FordDoorHandle_Product: public DoorHandle_AbstractProduct
{
public:
    // Tipărește numărul de serie specific produsului
    void printSerialNumber () {
        std :: cout << "DoorHandle_Product: Ford123 \ n";
    }
};

AbstracFactory
 Aceasta este o clasă foarte generică / abstractă care nu ar trebui să aibă mult mai mult decât funcțiile create. La final, o fabrică creează doar produse.

clasa Car_AbstractFactory
{
public:
 virtual DoorHandle_AbstractProduct * createDoorHandle () = 0;
 // virtual DoorWindow_AbstractProduct * createDoorWindow () = 0;
};

ConcreteFactory
Această clasă din fabrică este destul de specifică produsului. Muncitorul este cel care pune puzzle-ul împreună. În acest exemplu, este specific pentru o marcă {BMW, Ford}. Sarcina sa este de a returna o instanță a unui produs specific mărcii respective. Din nou, dacă am fi dorit să creămBMWDoorWindow, am putea crea de fapt o nouă funcție care returnează o instanță a clasei abstracte relevante. În depozitul meu de git, există și implementarea completă cu pieseleDoorWindow.

clasa BMWCar_ConcreteFactory: public Car_AbstractFactory
{
public:
    DoorHandle_AbstractProduct * createDoorHandle () {
        returnați noul BMWDoorHandle_Product;
    }
};
clasa FordCar_ConcreteFactory: public Car_AbstractFactory
{
public:
    DoorHandle_AbstractProduct * createDoorHandle () {
        returnați noul FordDoorHandle_Product;
    }
};

Functie principala
În cele din urmă, acesta este ultimul fragment de cod. Funcția principală care funcționează ca client. Clientul poate „comanda” cu ușurință produsele din fabrică și le poate folosi în orice fel dorește.

int principal ()
{
    // Clientul are nevoie de doorHandle și doorWindow
    Car_AbstractFactory * abstractFactory;
    DoorHandle_AbstractProduct * dHandle_AbstractProduct;
 
    // Clientul are nevoie de produse de la marca Ford
    abstractFactory = noul FordCar_ConcreteFactory;
    // Fabrica de beton Ford le creează
    // și le returnează clientului
    dHandle_AbstractProduct = abstractFactory-> createDoorHandle ();
    // Clientul folosește produsele
    dHandle_AbstractProduct -> printSerialNumber ();
    // Acum clientul vrea produse, dar de la marca BMW
    abstractFactory = new BMWCar_ConcreteFactory;
    // Deci fabrica de beton BMW le creează
    // și le returnează clientului
    dHandle_AbstractProduct = abstractFactory-> createDoorHandle ();
    // Clientul folosește produsele
    dHandle_AbstractProduct -> printSerialNumber ();
returnare 0;
}
// Iesire
// DoorHandle_Product: Ford123
// DoorHandle_Product: BMW123

Este posibil ca beneficiile să nu fie instantanee evidente. Însă imaginați-vă pentru o secundă câte produse are o mașină și câte lucruri poate face o fabrică de mașini. Acum imaginați-vă haosul menținând un cod prost proiectat de fiecare dată când BMW decide să schimbe mânerul ușii. Adăugați un nou tip de scaun pentru șofer sau chiar schimbați ceva în motor. Adăugând acum complexitatea, imaginați-vă că mențineți aceste probleme, dar pentru mai multe mărci. Fabrica abstractă oferă o abordare întreținută și curată, care poate fi folosită pentru anii următori. Ar fi dificil pentru un nou dezvoltator să se încurce și atât de ușor să adăugați / să eliminați un produs nou.

Fabrica abstractă este doar începutul acestei călătorii. Acesta este unul dintre cele mai utilizate modele de design și de multe ori este utilizat în combinație cu alte modele de design. Următorul blog va fi un ghid rapid pentru modelul de design Singleton. Nu uitați să-mi place blogul meu și să-mi urmați contul. Acest lucru înseamnă să-mi ofer satisfacția că am ajutat unii colegi dezvoltatori și să mă împing să continui să scriu.

Alte ghiduri rapide privind modelele de proiectare:

  1. Modele de proiectare - Un ghid rapid pentru Abstract Factory.
  2. Modele de proiectare - Un ghid rapid pentru modelul Bridge.
  3. Modele de proiectare - Un ghid rapid pentru modelul Builder.
  4. Modele de proiectare - Un ghid rapid pentru modelul de decorare.
  5. Modele de proiectare - Un ghid rapid pentru modelul fațadelor.
  6. Modele de proiectare - Un ghid rapid pentru modelul de observare.
  7. Modele de proiectare - Un ghid rapid pentru modelul Singleton.