Menu
Coddy logo textTech

Factory-Funktionen

Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 62 von 70.

Im gesamten Kurs hast du Objekte erstellt, indem du Konstruktoren direkt aufgerufen hast: Circle:new(), Rectangle:new() und so weiter. Aber was ist, wenn du abhängig von einer Bedingung verschiedene Arten von Objekten erstellen möchtest, ohne dass der aufrufende Code wissen muss, welche konkrete Klasse verwendet werden soll?

Hier kommt das Factory-Muster ins Spiel. Eine Factory ist einfach eine Funktion, die Objekte erstellt und zurückgibt. Der entscheidende Vorteil besteht darin, dass der Aufrufer die Details der Objekterstellung nicht kennen muss. Er fragt die Factory einfach nach dem, was er benötigt.

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

-- Der Aufrufer muss nichts über die Klassen Circle oder Square wissen
local myShape = createShape("circle")
print(myShape:area())

Die Factory-Funktion nimmt ein Zeichenfolgenargument entgegen und entscheidet, welche Klasse instanziiert werden soll. Dadurch wird die Logik zur Objekterstellung an einer Stelle zentralisiert. Wenn du später einen neuen Formtyp hinzufügst, musst du nur die Factory ändern und nicht jeden Codeabschnitt, der Formen erstellt.

Factorys sind besonders nützlich, wenn die Objekterstellung eine komplexe Einrichtung umfasst, wenn du Implementierungsdetails verbergen möchtest oder wenn der genaue Objekttyp von Laufzeitbedingungen wie Benutzereingaben oder Konfigurationsdateien abhängt.

challenge icon

Aufgabe

Einfach

Lass uns eine Pet Factory erstellen! Anstatt Haustiere direkt durch den Aufruf des Konstruktors jeder Klasse zu erstellen, erstellst du eine Factory-Funktion, die anhand eines einfachen Zeichenfolgenarguments den richtigen Haustiertyp erzeugt.

Du wirst deinen Code auf vier Dateien aufteilen:

  • Dog.lua: Erstelle eine Dog-Klasse mit einem :new(name)-Konstruktor, der den Namen des Haustiers speichert. Füge eine :speak()-Methode hinzu, die die Zeichenfolge "{name} says: Woof!" zurückgibt (wobei {name} der Name des Hundes ist).
  • Cat.lua: Erstelle eine Cat-Klasse mit derselben Struktur: einem :new(name)-Konstruktor und einer :speak()-Methode, die "{name} says: Meow!" zurückgibt.
  • PetFactory.lua: Hier kommt das Factory-Muster voll zur Geltung! Erstelle eine createPet(petType, name)-Funktion, die zwei Argumente entgegennimmt: eine Zeichenfolge, die den Haustiertyp angibt ("dog" oder "cat"), und den Namen des Haustiers. Die Funktion soll das passende Haustierobjekt zurückgeben. Wenn der Typ "dog" ist, gib einen neuen Dog zurück; bei "cat" einen neuen Cat.
  • main.lua: Binde dein PetFactory-Modul ein. Lies zwei Eingaben ein: den Haustiertyp und den Namen des Haustiers. Verwende deine Factory-Funktion, um das Haustier zu erstellen, rufe anschließend seine :speak()-Methode auf und gib das Ergebnis aus.

Der Vorteil des Factory-Musters besteht darin, dass dein Hauptcode Dog oder Cat nicht direkt einbinden muss. Er kennt nur die Factory. Die Factory kümmert sich um alle Details darüber, welche Klasse instanziiert werden soll.

Du erhältst zwei Eingaben:

  1. Haustiertyp (entweder "dog" oder "cat")
  2. Haustiername (eine Zeichenfolge)

Wenn die Eingaben beispielsweise dog und Buddy lauten, sollte die Ausgabe wie folgt aussehen:

Buddy says: Woof!

Wenn die Eingaben cat und Whiskers lauten, sollte die Ausgabe wie folgt aussehen:

Whiskers says: Meow!

Probier es selbst

-- main.lua
-- Verwende die PetFactory, um Haustiere zu erstellen

local PetFactory = require('PetFactory')

-- Eingaben lesen
local petType = io.read()
local petName = io.read()

-- TODO: Verwende PetFactory.createPet, um das Haustier zu erstellen
-- TODO: Rufe die :speak()-Methode des Haustiers auf und gib das Ergebnis aus
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Lua-Compiler