Funzioni factory
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 62 di 70.
Durante questo corso, hai creato oggetti chiamando direttamente i costruttori: Circle:new(), Rectangle:new() e così via. Ma cosa succede se vuoi creare diversi tipi di oggetti in base a una condizione, senza che il codice chiamante debba sapere quale classe specifica usare?
È qui che entra in gioco il Factory pattern. Una factory è semplicemente una funzione che crea e restituisce oggetti. Il vantaggio principale è che chi la chiama non deve conoscere i dettagli della creazione degli oggetti. Chiede semplicemente alla factory ciò di cui ha bisogno.
local function createShape(shapeType)
if shapeType == "circle" then
return Circle:new(10)
elseif shapeType == "square" then
return Square:new(5)
end
end
-- Chi chiama la funzione non ha bisogno di conoscere le classi Circle o Square
local myShape = createShape("circle")
print(myShape:area())
La funzione factory accetta un argomento stringa e decide quale classe istanziare. In questo modo, la logica di creazione degli oggetti è centralizzata in un unico punto. Se in seguito aggiungi un nuovo tipo di forma, modifichi solo la factory, non ogni parte di codice che crea forme.
Le factory sono particolarmente utili quando la creazione degli oggetti richiede una configurazione complessa, quando vuoi nascondere i dettagli di implementazione o quando il tipo esatto dell’oggetto dipende da condizioni di runtime come l’input dell’utente o i file di configurazione.
Sfida
FacileCostruiamo una fabbrica di animali domestici! Invece di creare direttamente gli animali domestici chiamando il costruttore di ciascuna classe, creerai una funzione factory che produce il tipo di animale domestico corretto in base a un semplice argomento stringa.
Organizzerai il codice in quattro file:
Dog.lua: Crea una classe Dog con un costruttore:new(name)che memorizza il nome dell'animale domestico. Aggiungi un metodo:speak()che restituisce la stringa"{name} says: Woof!"(dove {name} è il nome del cane).Cat.lua: Crea una classe Cat con la stessa struttura: un costruttore:new(name)e un metodo:speak()che restituisce"{name} says: Meow!".PetFactory.lua: È qui che il pattern Factory dà il meglio di sé! Crea una funzionecreatePet(petType, name)che accetta due argomenti: una stringa che indica il tipo di animale domestico ("dog"o"cat") e il nome dell'animale domestico. La funzione dovrebbe restituire l'oggetto animale domestico appropriato. Se il tipo è"dog", restituisci un nuovo Dog; se è"cat", restituisci un nuovo Cat.main.lua: Importa il modulo PetFactory. Leggi due input: il tipo di animale domestico e il suo nome. Usa la tua funzione factory per creare l'animale domestico, quindi chiama il suo metodo:speak()e stampa il risultato.
Il bello del pattern Factory è che il codice principale non deve importare direttamente Dog o Cat. Conosce solo la factory. La factory gestisce tutti i dettagli relativi alla classe da istanziare.
Riceverai due input:
- Tipo di animale domestico (
"dog"o"cat") - Nome dell'animale domestico (una stringa)
Per esempio, se gli input sono dog e Buddy, l'output dovrebbe essere:
Buddy says: Woof!Se gli input sono cat e Whiskers, l'output dovrebbe essere:
Whiskers says: Meow!Provalo tu
-- main.lua
-- Usa PetFactory per creare animali domestici
local PetFactory = require('PetFactory')
-- Leggi gli input
local petType = io.read()
local petName = io.read()
-- TODO: Usa PetFactory.createPet per creare l'animale domestico
-- TODO: Chiama il metodo :speak() dell'animale domestico e stampa il risultato
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Il concetto di «self»
Tabelle con funzioni«self» esplicitoLa sintassi dei due puntiPunto o due puntiRiepilogo - Spostare il punto4Progetto: Banca digitale
Configurazione del progettoMetodo di deposito2Schema del prototipo di classe
Il concetto di prototipoCollegare con __indexIl costruttore :new()Inizializzare gli attributiIstanze indipendentiRiepilogo - Fabbrica di auto5Sovraccarico degli operatori nella OOP
Sommare oggettiSottrarre oggettiConcatenare oggettiConfrontare oggetti (<, >)Ripasso - Calcoli con il portafoglio8Incapsulamento
Convenzioni di denominazioneClosure per la privacyAccesso tramite closureTabelle di sola letturaLogica di convalidaRiepilogo - Cassaforte sicura11Modelli di progettazione (base)
Funzioni factoryTabella singletonPattern IteratorObserver (listener)Riepilogo - Factory per logger3Stato e comportamento degli oggetti
Variabili di istanzaMetodi getterMetodi setterProprietà calcolateFormattazione delle stringheControlli di uguaglianzaRiepilogo - Voto dello studente6Fondamenti dell'ereditarietà
Configurare l'ereditarietàEreditare i metodiEstendere il costruttoreAggiungere metodi alla classe figliaCondiviso vs specificoRiepilogo - Gerarchia delle formeEsercitati da solo: Compilatore Lua online