Factory Method è un modello di progettazione creativa che consente a un’interfaccia o una classe di creare un oggetto, ma lascia che le sottoclassi decidano quale classe o oggetto creare un’istanza. Utilizzando il metodo di fabbrica, abbiamo i modi migliori per creare un oggetto. Qui, gli oggetti vengono creati senza esporre la logica al client e per creare il nuovo tipo di oggetto, il client utilizza la stessa interfaccia comune.
Problemi che affrontiamo senza metodo di fabbrica:
Immagina di avere la tua startup che fornisce il ridesharing nelle diverse parti del paese. La versione iniziale dell’app fornisce solo il ridesharing a due ruote, ma con il passare del tempo, la tua app diventa popolare e ora vuoi aggiungere anche il ridesharing a tre e quattro ruote.
È una grande notizia! ma per quanto riguarda gli sviluppatori di software del vostro avvio. Devono cambiare l’intero codice perché ora la maggior parte del codice è accoppiata con la classe a due ruote e gli sviluppatori devono apportare modifiche all’intera base di codice.
Dopo aver fatto tutte queste modifiche, gli sviluppatori terminano con il codice disordinato o con la lettera di dimissioni.
Localizer app
Rappresentazione schematica dei problemi senza l’utilizzo del Metodo Factory
Comprendiamo il concetto con un altro esempio relativo alle traduzioni e alla localizzazione delle diverse lingue.
Supponiamo di aver creato un’app il cui scopo principale è tradurre una lingua in un’altra e attualmente la nostra app funziona solo con 10 lingue. Ora la nostra applicazione è diventata molto popolare tra le persone, ma la domanda è cresciuta improvvisamente per includere 5 più lingue.
È una grande notizia! solo per il proprietario non per gli sviluppatori. Devono cambiare l’intero codice perché ora la maggior parte del codice è accoppiata solo con le lingue esistenti ed è per questo che gli sviluppatori devono apportare modifiche all’intera base di codice che è davvero un compito difficile da fare.
Diamo un’occhiata al codice per il problema che potremmo affrontare senza usare il metodo factory.
Nota: Il seguente codice viene scritto senza utilizzare il metodo di fabbrica.
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))
Soluzione con il metodo di fabbrica:
La sua soluzione consiste nel sostituire le chiamate di costruzione di oggetti diretti con chiamate al metodo speciale di fabbrica. In realtà non ci sarà alcuna differenza nella creazione dell’oggetto, ma vengono chiamati all’interno del metodo factory.
Ad esempio: Le nostre classi Two_Wheeler, Three_Wheeler e Four_wheeler dovrebbero implementare l’interfaccia di ridesharing che dichiarerà un metodo chiamato ride. Ogni classe implementerà questo metodo in modo univoco.
solution_factory_diagram
Ora cerchiamo di capire il metodo di fabbrica con l’aiuto di un esempio:
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))
Diagramma di Classe per la Fabbrica di Metodo:
vediamo il diagramma di classe considerando l’esempio di ride sharing.
Factory_pattern_class_diagrma
Vantaggi dell’utilizzo del metodo di fabbrica:
- Possiamo facilmente aggiungere i nuovi tipi di prodotti senza disturbare il codice client esistente.
- Generalmente, si evita l’accoppiamento stretto tra i prodotti e le classi e gli oggetti del creatore.
Svantaggi dell’utilizzo del metodo di fabbrica:
- Per creare un oggetto particluar concrete product, il client potrebbe dover sottoclasse la classe creator.
- Si finisce con un numero enorme di piccoli file, ad esempio, ingombrando i file.
- In un sistema grafico, a seconda dell’input dell’utente, può disegnare forme diverse come Rettangolo, Quadrato, cerchio, ecc. Ma per la facilità sia degli sviluppatori che del client, possiamo utilizzare il metodo factory per creare l’istanza in base all’input dell’utente. Quindi non dobbiamo cambiare il codice client per aggiungere una nuova forma.
- In un sito di prenotazione alberghiera, possiamo prenotare uno slot per 1 camera, 2 camere, 3 camere, ecc. Qui l’utente può inserire il numero di camere che vuole prenotare. Usando il metodo factory, possiamo creare una classe factory AnyRooms che ci aiuterà a creare l’istanza in base all’input dell’utente. Ancora una volta non dobbiamo cambiare il codice del cliente per aggiungere la nuova struttura.
Applicabilità :
Leggi ulteriormente: Modello di fabbrica in C++