Il modello di progettazione del metodo di fabbrica in Python

Introduzione

In questo articolo, ci immergeremo nel modello di progettazione del metodo di fabbrica, implementato in Python.

I modelli di progettazione definiscono soluzioni collaudate a vari problemi ricorrenti nello sviluppo del software. Non rappresentano il codice reale, ma piuttosto i modi in cui possiamo organizzare il nostro codice per i risultati ottimali.

In un mondo di risorse limitate, i modelli di progettazione ci aiutano a ottenere il maggior numero di risultati con la minor quantità di risorse utilizzate. È anche importante notare che i modelli di progettazione non si applicano a tutte le situazioni ed è fondamentale valutare il problema in questione per scegliere l’approccio migliore per quel particolare scenario.

I modelli di progettazione sono divisi in alcune grandi categorie, anche se principalmente in modelli creazionali, modelli strutturali e modelli comportamentali.

Il modello del metodo di fabbrica è un modello di progettazione creativa.

Il modello di progettazione del metodo di fabbrica

Definizione

Il metodo di fabbrica viene utilizzato nella programmazione orientata agli oggetti come mezzo per fornire interfacce di fabbrica per la creazione di oggetti. Queste interfacce definiscono la struttura generica, ma non inizializzano gli oggetti. L’inizializzazione è lasciata a sottoclassi più specifiche.

La classe/interfaccia genitore ospita tutti i comportamenti standard e generici che possono essere condivisi tra sottoclassi di diversi tipi. La sottoclasse è a sua volta responsabile della definizione e dell’istanziazione dell’oggetto in base alla superclasse.

Motivazione

La motivazione principale dietro il modello di progettazione del metodo di fabbrica è quella di migliorare l’accoppiamento libero nel codice attraverso la creazione di una classe astratta che verrà utilizzata per creare diversi tipi di oggetti che condividono alcuni attributi e funzionalità comuni.

Ciò si traduce in una maggiore flessibilità e riutilizzo del codice perché la funzionalità condivisa non verrà riscritta essendo stata ereditata dalla stessa classe. Questo modello di progettazione è anche noto come Costruttore virtuale.

Il modello di progettazione del metodo Factory viene comunemente utilizzato nelle librerie consentendo ai client di scegliere quale sottoclasse o tipo di oggetto creare attraverso una classe astratta.

Un metodo Factory riceverà informazioni su un oggetto richiesto, lo istanzierà e restituirà l’oggetto del tipo specificato. Questo dà alla nostra applicazione o libreria un unico punto di interazione con altri programmi o pezzi di codice, incapsulando così la nostra funzionalità di creazione di oggetti.

Implementazione del metodo di fabbrica

Il nostro programma sarà una libreria utilizzata per gestire gli oggetti shape in termini di creazione e altre operazioni come aggiungere colore e calcolare l’area della forma.

Gli utenti dovrebbero essere in grado di utilizzare la nostra libreria per creare nuovi oggetti. Possiamo iniziare creando singole forme individuali e avvalendoci di esse così com’è, ma ciò significherebbe che molta logica condivisa dovrà essere riscritta per ogni forma che abbiamo a disposizione.

Il primo passo per risolvere questa ripetizione consiste nel creare una classe di forma padre con metodi come calculate_area() e calculate_perimeter() e proprietà come le dimensioni.

Gli oggetti shape specifici erediteranno quindi dalla nostra classe base. Per creare una forma, dovremo identificare quale tipo di forma è richiesta e creare la sottoclasse per essa.

Inizieremo creando una classe astratta per rappresentare una forma generica:

Questa è la classe base per tutte le nostre forme. Andiamo avanti e creiamo diverse forme concrete e più specifiche:

Finora, abbiamo creato una classe astratta ed esteso per soddisfare diverse forme che saranno disponibili nella nostra libreria. Per creare i diversi oggetti shape, i clienti dovranno conoscere i nomi e i dettagli delle nostre forme ed eseguire separatamente la creazione.

Qui entra in gioco il metodo Factory.

Il modello di progettazione del metodo Factory ci aiuterà ad astrarre le forme disponibili dal client, cioè il client non deve conoscere tutte le forme disponibili, ma piuttosto creare solo ciò di cui ha bisogno durante il runtime. Ci permetterà anche di centralizzare e incapsulare la creazione dell’oggetto.

Cerchiamo di raggiungere questo obiettivo creando un ShapeFactory che verrà utilizzato per creare le classi di forma specifiche in base all’input del client:

Questa è la nostra interfaccia per la creazione. Non chiamiamo i costruttori di classi concrete, chiamiamo la Fabbrica e chiediamo di creare una forma.

Il nostro ShapeFactory funziona ricevendo informazioni su una forma come un nome e le dimensioni richieste. Il nostro metodo di fabbrica create_shape() verrà quindi utilizzato per creare e restituire oggetti pronti delle forme desiderate.

Il client non deve sapere nulla sulla creazione o sulle specifiche dell’oggetto. Usando l’oggetto factory, possono creare oggetti con una conoscenza minima di come funzionano:

L’esecuzione di questo codice comporterà:

Oppure, potremmo costruire un’altra forma:

Ciò che vale la pena notare è che oltre al client non dover sapere molto sul processo di creazione – quando vorremmo istanziare un oggetto, non chiamiamo il costruttore della classe. Chiediamo alla fabbrica di farlo per noi in base alle informazioni che passiamo alla funzione create_shape().

Pro e contro

Pro

Uno dei principali vantaggi dell’utilizzo del modello di progettazione del metodo di fabbrica è che il nostro codice diventa liberamente accoppiato in quanto la maggior parte dei componenti del nostro codice non sono a conoscenza di altri componenti della stessa base di codice.

Ciò si traduce in codice che è facile da capire e testare e aggiungere più funzionalità a componenti specifici senza influenzare o interrompere l’intero programma.

Il modello di progettazione del metodo di fabbrica aiuta anche a sostenere il principio di responsabilità singola in cui classi e oggetti che gestiscono funzionalità specifiche con conseguente codice migliore.

Contro

La creazione di più classi alla fine porta a una minore leggibilità. Se combinato con una fabbrica astratta (fabbrica di fabbriche), il codice diventerà presto prolisso, anche se mantenibile.

Conclusione

In conclusione, il modello di progettazione del metodo Factory ci consente di creare oggetti senza specificare la classe esatta richiesta per creare l’oggetto particolare. Questo ci permette di disaccoppiare il nostro codice e migliora la sua riutilizzabilità.

È importante notare che, proprio come qualsiasi altro modello di progettazione, è adatto solo per situazioni specifiche e non per tutti gli scenari di sviluppo. Una valutazione della situazione a portata di mano è fondamentale prima di decidere di implementare il modello di progettazione del metodo di fabbrica per raccogliere i benefici del modello.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.