Menu
Coddy logo textTech

Singleton-Tabelle

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

Manchmal benötigen Sie genau eine Instanz von etwas in Ihrem gesamten Programm – einen Konfigurationsmanager, ein Protokollierungssystem oder Spieleinstellungen. Das Erstellen mehrerer Kopien würde Probleme verursachen: Welche davon enthält die richtigen Daten? Das Singleton-Muster stellt sicher, dass nur eine Instanz existiert.

In Lua ist die Implementierung eines Singletons dank der Funktionsweise von Modulen überraschend einfach. Wenn Sie ein Modul mit require einbinden, speichert Lua das Ergebnis im Cache. Nachfolgende Aufrufe von require geben die im Cache gespeicherte Tabelle zurück, keine neue.

-- GameConfig.lua
local GameConfig = {
    volume = 80,
    difficulty = "normal"
}

function GameConfig:setVolume(v)
    self.volume = v
end

return GameConfig

Jetzt, überall in Ihrem Programm:

local config1 = require("GameConfig")
local config2 = require("GameConfig")

config1:setVolume(50)
print(config2.volume)  -- 50 (dieselbe Tabelle!)

Sowohl config1 als auch config2 beziehen sich auf genau dieselbe Tabelle. Änderungen, die über eine Variable vorgenommen werden, sind über die andere sichtbar. Dies geschieht automatisch, da Luas require den zurückgegebenen Wert in package.loaded speichert und ihn wiederverwendet.

Im Gegensatz zum Factory-Pattern, das neue Objekte erstellt, garantiert ein Singleton einen gemeinsamen Zustand über Ihre gesamte Anwendung hinweg. Dies ist ideal für globale Einstellungen, auf die mehrere Teile Ihres Codes konsistent zugreifen und diese ändern müssen.

challenge icon

Aufgabe

Einfach

Lass uns einen Spieleinstellungen-Manager mit dem Singleton-Muster erstellen! Du wirst ein Konfigurationsmodul erstellen, das sicherstellt, dass jeder Teil deines Programms auf genau dieselben Einstellungen zugreift – egal wie oft es angefordert wird.

Du wirst deinen Code in zwei Dateien organisieren:

  • GameSettings.lua: Erstelle ein Singleton-Modul, das die Spielkonfiguration speichert. Deine Einstellungstabelle sollte musicVolume (beginnend bei 70), sfxVolume (beginnend bei 100) und difficulty (beginnend bei "normal") enthalten. Füge drei Methoden hinzu: :setMusicVolume(value), :setSfxVolume(value) und :setDifficulty(level), um diese Einstellungen zu ändern. Vergiss nicht, die Tabelle am Ende des Moduls zurückzugeben!
  • main.lua: Demonstriere, dass das Singleton funktioniert, indem du dein GameSettings-Modul zweimal in verschiedene Variablen anforderst (require). Verwende die erste Variable, um die Musiklautstärke und den Schwierigkeitsgrad zu ändern. Verwende dann die zweite Variable, um alle drei Einstellungen auszugeben – wenn das Singleton korrekt funktioniert, referenzieren beide Variablen dieselbe Tabelle, sodass Änderungen, die über die eine vorgenommen wurden, über die andere sichtbar sind.

Du wirst zwei Eingaben erhalten:

  1. Neue Musiklautstärke (eine Zahl)
  2. Neuer Schwierigkeitsgrad (ein String wie "easy" oder "hard")

Nachdem du die Einstellungen über die erste Variable geändert hast, gib die drei Einstellungen über die zweite Variable aus, jede in einer eigenen Zeile in dieser Reihenfolge: Musiklautstärke, SFX-Lautstärke und dann Schwierigkeitsgrad.

Wenn die Eingaben zum Beispiel 50 und hard sind, sollte die Ausgabe wie folgt aussehen:

50
100
hard

Wenn die Eingaben 25 und easy sind, sollte die Ausgabe wie folgt aussehen:

25
100
easy

Beachte, dass die SFX-Lautstärke bei ihrem Standardwert von 100 bleibt, da wir sie nie geändert haben – aber die Musiklautstärke und der Schwierigkeitsgrad spiegeln die über die erste Variable vorgenommenen Änderungen wider, was beweist, dass beide Variablen auf dieselbe Singleton-Instanz zeigen!

Probier es selbst

-- main.lua - Demonstriere das Singleton-Pattern

-- Eingaben lesen
local newMusicVolume = tonumber(io.read())
local newDifficulty = io.read()

-- TODO: Binde das GameSettings-Modul in eine Variable ein (z. B. settings1)

-- TODO: Binde das GameSettings-Modul ERNEUT in eine ANDERE Variable ein (z. B. settings2)
-- (Wenn das Singleton korrekt funktioniert, referenzieren beide Variablen dieselbe Tabelle!)

-- TODO: Verwende die ERSTE Variable, um:
--   - Die Musiklautstärke auf newMusicVolume zu setzen
--   - Den Schwierigkeitsgrad auf newDifficulty zu setzen

-- TODO: Verwende die ZWEITE Variable, um die Einstellungen auszugeben
-- Gib jeden Wert in einer eigenen Zeile aus: musicVolume, sfxVolume, difficulty
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