Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Costruiamo 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 funzione createPet(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:

  1. Tipo di animale domestico ("dog" o "cat")
  2. 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
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Lua online