Abstract Factory Pattern in Python
Create whole families of matching objects, such as a dark-theme button and checkbox, without naming their classes.
- Product families
- One factory per family
- Swapping the whole family at once
theme factoryDarkThemeFactoryDarkButtonDarkCheckbox
LightThemeFactoryLightButtonLightCheckbox
One factory, one matching family
Abstract Factory è un design pattern per creare un'intera famiglia (family) di oggetti correlati, senza indicare la classe concreta di ciascuno. Per esempio, un'interfaccia in modalità scura ha bisogno di pulsanti e caselle di controllo nello stesso stile scuro, senza mescolarli con lo stile chiaro.
Punti chiave
- A factory has one method per product:
create_button(),create_checkbox(). - DarkThemeFactory returns dark widgets; LightThemeFactory returns light ones.
- The client receives a factory and never mixes themes by accident.
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 DarkButton:
# Abstract Factory: create products that belong to one family.
def render(self): return "Dark button"
class DarkCheckbox:
def render(self): return "Dark checkbox"
class DarkThemeFactory:
# Produce a compatible family of UI objects.
def create_button(self): return DarkButton()
def create_checkbox(self): return DarkCheckbox()
factory = DarkThemeFactory()
print(factory.create_button().render())
print(factory.create_checkbox().render())
Risultato dell'esecuzione
Dark button
Dark checkbox
Spiegazione del codice
Ogni factory crea un insieme di pulsante e casella di controllo nello stesso stile: per esempio, la factory della modalità scura crea DarkButton e DarkCheckbox. Il codice che li usa lavora solo con la factory, quindi non mescola mai per sbaglio componenti di stili diversi.
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.