modelul fabricii
când dezvoltați cod, puteți instantia obiecte direct în metode sau în clase. Deși acest lucru este destul de normal, poate doriți să adăugați o abstractizare suplimentară între crearea obiectului și locul în care este utilizat în proiectul dvs.
puteți utiliza modelul din fabrică pentru a adăuga acea abstractizare suplimentară. Modelul din fabrică este unul dintre cele mai ușoare modele de înțeles și implementat.
adăugarea unei abstractizări suplimentare vă va permite, de asemenea, să alegeți dinamic clase de instantiat pe baza unui fel de logică.
înainte de abstractizare, clasa sau metoda dvs. ar crea direct o clasă concretă. După adăugarea abstractizării din fabrică, clasa de beton este acum creată în afara clasei/metodei actuale și acum într-o subclasă.
Imaginați-vă o aplicație pentru proiectarea caselor, iar casa are un scaun deja adăugat pe podea în mod implicit. Prin adăugarea modelului din fabrică, puteți oferi utilizatorului opțiunea de a alege diferite scaune și câte în timpul rulării. În loc de scaun fiind greu codificate în proiect atunci când a început, utilizatorul are acum opțiunea de a alege.
adăugarea acestei abstractizări suplimentare înseamnă, de asemenea, că complicațiile instanțierii obiectelor suplimentare pot fi acum ascunse clasei sau metodei care o folosește.
această separare face, de asemenea, codul dvs. mai ușor de citit și documentat.
modelul din fabrică este într-adevăr despre adăugarea acelei abstractizări suplimentare între crearea obiectului și locul în care este utilizat. Acest lucru vă oferă opțiuni suplimentare pe care le puteți extinde mai ușor în viitor.
- creator concret: aplicația client, clasa sau metoda care apelează creatorul (metoda din fabrică).
- interfață produs: interfața care descrie atributele și metodele pe care Fabrica le va cere pentru a crea produsul/obiectul final.
- Creator: clasa fabrica. Declară metoda din fabrică care va returna obiectul solicitat de la acesta.
- produs din beton: obiectul s-a întors din fabrică. Obiectul implementează interfața produsului.
diagrama UML din fabrică
cod sursă
în acest exemplu de concept, clientul dorește un obiect numit b
mai degrabă decât să creeze b
direct în client, solicită creatorului (fabricii) obiectul în schimb.
fabrica găsește clasa relevantă folosind un fel de logică din atributele cererii. Apoi solicită subclasei să instantieze noul obiect pe care îl întoarce apoi ca referință înapoi la clientul care îl cere.
./factory/factory_concept.py
"""
The Factory Pattern Concept
https://sbcode.net/python/factory/#factoryfactory_conceptpy
"""from abc import ABCMeta, abstractmethodclass IProduct(metaclass=ABCMeta):
"A Hypothetical Class Interface (Product)" @staticmethod
@abstractmethod
def create_object():
"An abstract interface method"class ConcreteProductA(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductA" def create_object(self):
return selfclass ConcreteProductB(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductB" def create_object(self):
return selfclass ConcreteProductC(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductC" def create_object(self):
return selfclass Creator:
"The Factory Class" @staticmethod
def create_object(some_property):
"A static method to get a concrete product"
if some_property == 'a':
return ConcreteProductA()
if some_property == 'b':
return ConcreteProductB()
if some_property == 'c':
return ConcreteProductC()
return None# The Client
PRODUCT = Creator().create_object('b')
print(PRODUCT.name)
Ieșire
python ./factory/factory_concept.py
ConcreteProductB
Prezentare generală a modelului fabricii Video
exemplu de Utilizare caz
vizitați fabrica-modele de proiectare în Python (sbcode.net) pentru un exemplu de utilizare a modelului din fabrică.
un exemplu de caz de utilizare este o interfață de utilizator în care utilizatorul poate selecta dintr-un meniu de elemente, cum ar fi scaune.
utilizatorului i s-a oferit posibilitatea de a alege folosind un fel de interfață de navigare și nu se știe ce alegere sau câte va face utilizatorul până când aplicația rulează efectiv și utilizatorul începe să o folosească.
deci, atunci când utilizatorul a selectat scaunul, fabrica ia apoi o proprietate implicată în acea selecție, cum ar fi un ID, un tip sau alt atribut și apoi decide ce subclasă relevantă să instantieze pentru a returna obiectul corespunzător.
vedeți gif-ul de mai sus pentru un exemplu foarte grafic al unui exemplu din lumea reală de utilizare a modelului din fabrică pentru a returna obiectele scaunului. Panoul din stânga conține scaune, iar atunci când trageți și fixați un scaun pe panoul din dreapta, acesta apelează Fabrica de scaune pentru a-i returna un scaun.
utilizarea modelului din fabrică-video case
rezumat
- modelul din fabrică este o interfață care amână crearea obiectului final la o subclasă.
- modelul din fabrică este despre inserarea unui alt strat/abstractizare între instanțierea unui obiect și locul în care este utilizat efectiv în codul dvs.
- nu se știe ce sau câte obiecte vor trebui create până la rulare.
- doriți să localizați cunoștințele despre specificul instanțierii unui anumit obiect la subclasă, astfel încât clientul să nu fie preocupat de detalii.
- doriți să creați un cadru extern, că o aplicație poate importa/referință, și ascunde detaliile specificul implicate în crearea obiectului final/produs.
- factorul unic care definește modelul fabricii este că proiectul dvs. amână acum crearea de obiecte la subclasa căreia fabrica i-a delegat-o.
modele de proiectare în Python (carte)
uneori doriți doar să opriți computerul și să citească dintr-o carte. Deci, acest model, plus toate celelalte modele GoF sunt discutate în modelele mele de Design în Cartea Python ASIN B08XLJ8Z2J