Menu
Coddy logo textTech

Funciones Factory

Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 62 de 70.

A lo largo de este curso, has creado objetos llamando directamente a los constructores: Circle:new(), Rectangle:new(), etc. Pero ¿qué ocurre si quieres crear distintos tipos de objetos en función de alguna condición, sin que el código que realiza la llamada tenga que saber qué clase específica usar?

Aquí es donde entra en juego el patrón Factory. Una factory es simplemente una función que crea y devuelve objetos. El beneficio clave es que quien realiza la llamada no necesita conocer los detalles de la creación de objetos. Simplemente le pide a la factory lo que necesita.

local function createShape(shapeType)
    if shapeType == "circle" then
        return Circle:new(10)
    elseif shapeType == "square" then
        return Square:new(5)
    end
end

-- El llamador no necesita saber sobre las clases Circle o Square
local myShape = createShape("circle")
print(myShape:area())

La función de fábrica recibe un argumento de tipo cadena y decide qué clase instanciar. Esto centraliza la lógica de creación de objetos en un solo lugar. Si más adelante añades un nuevo tipo de forma, solo modificas la fábrica, no cada fragmento de código que crea formas.

Las fábricas son especialmente útiles cuando la creación de objetos implica una configuración compleja, cuando quieres ocultar los detalles de implementación o cuando el tipo exacto de objeto depende de condiciones de ejecución, como la entrada del usuario o los archivos de configuración.

challenge icon

Desafío

Fácil

¡Construyamos una fábrica de mascotas! En lugar de crear mascotas directamente llamando al constructor de cada clase, crearás una función de fábrica que produzca el tipo correcto de mascota basándose en un argumento de cadena sencillo.

Organizarás tu código en cuatro archivos:

  • Dog.lua: Crea una clase Dog con un constructor :new(name) que almacene el nombre de la mascota. Añade un método :speak() que devuelva la cadena "{name} says: Woof!" (donde {name} es el nombre del perro).
  • Cat.lua: Crea una clase Cat con la misma estructura: un constructor :new(name) y un método :speak() que devuelva "{name} says: Meow!".
  • PetFactory.lua: ¡Aquí es donde brilla el patrón Factory! Crea una función createPet(petType, name) que acepte dos argumentos: una cadena que indique el tipo de mascota ("dog" o "cat") y el nombre de la mascota. La función debe devolver el objeto de mascota correspondiente. Si el tipo es "dog", devuelve un Dog nuevo; si es "cat", devuelve un Cat nuevo.
  • main.lua: Requiere tu módulo PetFactory. Lee dos entradas: el tipo de mascota y el nombre de la mascota. Usa tu función de fábrica para crear la mascota, después llama a su método :speak() e imprime el resultado.

La ventaja del patrón Factory es que tu código principal no necesita requerir Dog ni Cat directamente. Solo conoce la fábrica. La fábrica se encarga de todos los detalles sobre qué clase instanciar.

Recibirás dos entradas:

  1. Tipo de mascota (puede ser "dog" o "cat")
  2. Nombre de la mascota (una cadena)

Por ejemplo, si las entradas son dog y Buddy, la salida debería ser:

Buddy says: Woof!

Si las entradas son cat y Whiskers, la salida debería ser:

Whiskers says: Meow!

Pruébalo tú mismo

-- main.lua
-- Usa el PetFactory para crear mascotas

local PetFactory = require('PetFactory')

-- Lee las entradas
local petType = io.read()
local petName = io.read()

-- TODO: Usa PetFactory.createPet para crear la mascota
-- TODO: Llama al método :speak() de la mascota e imprime el resultado
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Lua online