Factory Method este un model de design creativ care permite unei interfețe sau unei clase să creeze un obiect, dar lasă subclasele să decidă ce clasă sau obiect să instantieze. Folosind metoda din fabrică, avem cele mai bune modalități de a crea un obiect. Aici, obiectele sunt create fără a expune logica clientului și pentru crearea noului tip de obiect, clientul folosește aceeași interfață comună.
probleme cu care ne confruntăm fără metoda din fabrică:
Imaginați-vă că aveți propria pornire, care oferă ridesharing în diferite părți ale țării. Versiunea inițială a aplicației oferă doar două roți ridesharing, dar pe măsură ce trece timpul, aplicația devine popular și acum doriți să adăugați trei și patru roți, de asemenea, ridesharing.
este o veste minunată! dar ce zici de dezvoltatorii de software ai startup-ului tău. Ei trebuie să schimbe întregul cod, deoarece acum cea mai mare parte a codului este cuplată cu clasa cu două roți, iar dezvoltatorii trebuie să facă modificări în întreaga bază de cod.
după ce ați terminat cu toate aceste modificări, fie dezvoltatorii se termină cu codul dezordonat, fie cu scrisoarea de demisie.
Localizer app
reprezentarea Diagramatică a problemelor fără a utiliza metoda din fabrică
să înțelegem conceptul cu încă un exemplu care este legat de traducerile și localizarea diferitelor limbi.
să presupunem că am creat o aplicație al cărei scop principal este de a traduce o limbă în alta și în prezent aplicația noastră funcționează doar cu 10 limbi. Acum, aplicația noastră a devenit foarte populară în rândul oamenilor, dar cererea a crescut brusc pentru a include încă 5 limbi.
este o veste minunată! numai pentru proprietar, nu pentru dezvoltatori. Ei trebuie să schimbe întregul cod, deoarece acum cea mai mare parte a codului este cuplată doar cu limbile existente și de aceea dezvoltatorii trebuie să facă modificări în întreaga bază de cod, ceea ce este într-adevăr o sarcină dificilă de făcut.
să ne uităm la codul pentru problema cu care ne putem confrunta fără a utiliza metoda din fabrică.
notă: Următorul cod este scris fără a utiliza metoda din fabrică.
class
FrenchLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"voiture"
,
"bike"
:
"bicyclette"
,
"cycle"
:
"cyclette"
}
def
localize(
self
, message):
return
self
.translations.get(msg, msg)
class
SpanishLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"coche"
,
"bike"
:
"bicicleta"
,
"cycle"
:
"ciclo"
}
def
localize(
self
, msg):
return
self
.translations.get(msg, msg)
class
EnglishLocalizer:
def
localize(
self
, msg):
return
msg
if
__name__
=
=
"__main__"
:
f
=
FrenchLocalizer()
e
=
EnglishLocalizer()
s
=
SpanishLocalizer()
message
=
for
msg
in
message:
print
(f.localize(msg))
print
(e.localize(msg))
print
(s.localize(msg))
soluție prin metoda din fabrică:
soluția sa este de a înlocui apelurile de construcție a obiectelor directe cu apeluri către metoda specială din fabrică. De fapt, nu va exista nici o diferență în crearea obiectului, dar acestea sunt numite în cadrul metodei din fabrică.
de exemplu: clasele noastre Two_Wheeler, Three_Wheeler și Four_wheeler ar trebui să implementeze interfața ridesharing care va declara o metodă numită ride. Fiecare clasă va implementa această metodă în mod unic.
solution_factory_diagram
acum să înțelegem metoda din fabrică cu ajutorul unui exemplu:
class
FrenchLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"voiture"
,
"bike"
:
"bicyclette"
,
"cycle"
:
"cyclette"
}
def
localize(
self
, message):
return
self
.translations.get(msg, msg)
class
SpanishLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"coche"
,
"bike"
:
"bicicleta"
,
"cycle"
:
"ciclo"
}
def
localize(
self
, msg):
return
self
.translations.get(msg, msg)
class
EnglishLocalizer:
def
localize(
self
, msg):
return
msg
def
Factory(language
=
"English"
):
localizers
=
{
"French"
: FrenchLocalizer,
"English"
: EnglishLocalizer,
"Spanish"
: SpanishLocalizer,
}
return
localizers()
if
__name__
=
=
"__main__"
:
f
=
Factory(
"French"
)
e
=
Factory(
"English"
)
s
=
Factory(
"Spanish"
)
message
=
for
msg
in
message:
print
(f.localize(msg))
print
(e.localize(msg))
print
(s.localize(msg))
diagrama de clasă pentru metoda din fabrică:
să ne uităm la diagrama de clasă luând în considerare exemplul de partajare a călătoriei.
Factory_pattern_class_diagrma
avantajele utilizării metodei din fabrică:
- putem adăuga cu ușurință noile tipuri de produse fără a deranja codul clientului existent.
- în general, se evită cuplarea strânsă între produse și clasele și obiectele creatorului.
dezavantaje ale utilizării metodei din fabrică:
- pentru a crea un obiect de produs din beton particular, clientul ar putea fi nevoit să subclaseze clasa creator.
- ai termina cu număr foarte mare de fișiere mici, adică, aglomerarea de fișiere.
- într-un sistem grafic, în funcție de intrarea utilizatorului, acesta poate desena diferite forme precum dreptunghi, pătrat, cerc etc. Dar pentru ușurința atât a dezvoltatorilor, cât și a clientului, putem folosi metoda din fabrică pentru a crea instanța în funcție de intrarea utilizatorului. Atunci nu trebuie să schimbăm codul clientului pentru a adăuga o nouă formă.
- într-un site de rezervare a hotelului, putem rezerva un slot pentru 1 cameră, 2 camere, 3 camere etc. Aici utilizatorul poate introduce numărul de camere pe care dorește să le rezerve. Folosind metoda din fabrică, putem crea o clasă de fabrică anyrooms care ne va ajuta să creăm instanța în funcție de intrarea utilizatorului. Din nou, nu trebuie să schimbăm codul clientului pentru adăugarea noii facilități.
aplicabilitate :
citiți mai departe: modelul fabricii în C++