Factory Method Pattern in Python
Let a factory decide which class to create, so the calling code only works with a common interface.
- Separating creation from use
- A factory method that returns different classes
- Adding a new type without changing callers
Notificationsend(message)EmailNotification"email"SmsNotification"sms"
Ask for an interface, get the right class
Factory Method è un design pattern che affida la creazione degli oggetti a un metodo apposito (la factory). Il codice che usa l'oggetto deve solo sapere quali metodi ha, senza sapere esattamente quale classe è stata creata. Così, quando aggiungi un nuovo tipo di oggetto, non devi modificare il codice che lo usa.
Punti chiave
- Client code asks the factory for a notification and calls
send(). - The factory chooses EmailNotification, SmsNotification or another class.
- Adding a new channel changes only the factory, not the callers.
Quando si usa?
- Risolvere problemi ricorrenti di progettazione a oggetti con strutture collaudate.
- Disaccoppiare le responsabilità per rendere il codice più facile da estendere e testare.
- Usare un vocabolario di progettazione condiviso nelle discussioni di architettura con il team.
Codice di esempio
class EmailNotification:
# Factory Method: creation is separated from object usage.
def send(self, message):
return f"Email: {message}"
class SmsNotification:
def send(self, message):
return f"SMS: {message}"
def create_notification(channel):
# Centralize the concrete-class selection.
factories = {"email": EmailNotification, "sms": SmsNotification}
return factories[channel]()
notification = create_notification("email")
print(notification.send("Hello"))
Risultato dell'esecuzione
Email: Hello
Spiegazione del codice
La funzione create_notification() sceglie la classe EmailNotification o SmsNotification in base al parametro channel ricevuto. Il codice chiamante usa solo il metodo send(), presente in entrambe le classi, quindi non dipende dal tipo specifico di notifica. Il risultato stampato è Email: Hello.
Modifica i valori ed esegui il programma nel compilatore Python online CodeUtility senza installare Python.
Esercizi di approfondimento
Prova a modificare il codice seguendo i suggerimenti qui sotto. Cambiare il codice e osservare il risultato ti aiuta a capire molto più che leggerlo soltanto.
- Sostituisci il dominio di esempio mantenendo la struttura del pattern.
- Confronta il pattern con un’implementazione più semplice e spiegane i compromessi.
- Scrivi test per ogni partecipante prima di aggiungere un’altra implementazione.
Esercitati con una sfida
Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.
Tutte le sfide