Design pattern in Python

Factory Method Pattern in Python

Let a factory decide which class to create, so the calling code only works with a common interface.

  • Avanzato
  • 3 min di lettura
  • 1 esempio eseguibile
Cosa imparerai
  • Separating creation from use
  • A factory method that returns different classes
  • Adding a new type without changing callers
create_notification(kind)
  • Notificationsend(message)
    • EmailNotification"email"
    • SmsNotification"sms"
The caller only sees Notification.send().

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

  1. Client code asks the factory for a notification and calls send().
  2. The factory chooses EmailNotification, SmsNotification or another class.
  3. 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

Esegui codice →
main.py
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"))
Crea un pulsante Run per questo esempio

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.

  1. Sostituisci il dominio di esempio mantenendo la struttura del pattern.
  2. Confronta il pattern con un’implementazione più semplice e spiegane i compromessi.
  3. Scrivi test per ogni partecipante prima di aggiungere un’altra implementazione.
Esegui nel compilatore Python →

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