Menu
Coddy logo textTech

Funkcje fabrykujące

Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 62 z 70.

W trakcie tego kursu tworzyłeś obiekty, wywołując bezpośrednio konstruktory: Circle:new(), Rectangle:new() i tak dalej. Ale co, jeśli chcesz tworzyć różne typy obiektów w zależności od jakiegoś warunku, bez konieczności informowania wywołującego kodu, której konkretnej klasy użyć?

W tym miejscu przydaje się wzorzec fabryki. Fabryka to po prostu funkcja, która tworzy i zwraca obiekty. Jej główną zaletą jest to, że wywołujący nie musi znać szczegółów tworzenia obiektów. Po prostu prosi fabrykę o to, czego potrzebuje.

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

-- Kod wywołujący nie musi znać klas Circle ani Square
local myShape = createShape("circle")
print(myShape:area())

Funkcja fabrykująca przyjmuje argument typu string i decyduje, którą klasę utworzyć. Dzięki temu logika tworzenia obiektów jest scentralizowana w jednym miejscu. Jeśli później dodasz nowy typ kształtu, zmodyfikujesz tylko fabrykę, a nie każdy fragment kodu, który tworzy kształty.

Fabryki są szczególnie przydatne, gdy tworzenie obiektów wiąże się ze złożoną konfiguracją, gdy chcesz ukryć szczegóły implementacji lub gdy dokładny typ obiektu zależy od warunków w czasie wykonywania, takich jak dane wejściowe użytkownika lub pliki konfiguracyjne.

challenge icon

Wyzwanie

Łatwy

Zbudujmy fabrykę zwierząt! Zamiast tworzyć zwierzęta bezpośrednio, wywołując konstruktor każdej klasy, utworzysz funkcję fabrykującą, która na podstawie prostego argumentu tekstowego tworzy zwierzę odpowiedniego typu.

Rozmieścisz swój kod w czterech plikach:

  • Dog.lua: Utwórz klasę Dog z konstruktorem :new(name), który zapisuje imię zwierzęcia. Dodaj metodę :speak(), która zwraca tekst "{name} says: Woof!" (gdzie {name} to imię psa).
  • Cat.lua: Utwórz klasę Cat o takiej samej strukturze: konstruktor :new(name) i metodę :speak(), która zwraca "{name} says: Meow!".
  • PetFactory.lua: To właśnie tutaj wzorzec fabryki pokazuje swoje zalety! Utwórz funkcję createPet(petType, name), która przyjmuje dwa argumenty: tekst określający typ zwierzęcia ("dog" lub "cat") oraz imię zwierzęcia. Funkcja powinna zwracać obiekt odpowiedniego zwierzęcia. Jeśli typ to "dog", zwróć nowego psa; jeśli "cat" — nowego kota.
  • main.lua: Załaduj moduł PetFactory. Odczytaj dwa dane wejściowe: typ zwierzęcia i jego imię. Użyj funkcji fabrykującej, aby utworzyć zwierzę, a następnie wywołaj jego metodę :speak() i wypisz wynik.

Zaletą wzorca fabryki jest to, że główny kod nie musi bezpośrednio ładować Dog ani Cat. Zna tylko fabrykę. Fabryka zajmuje się wszystkimi szczegółami dotyczącymi tego, którą klasę utworzyć.

Otrzymasz dwa dane wejściowe:

  1. Typ zwierzęcia (albo "dog", albo "cat")
  2. Imię zwierzęcia (tekst)

Na przykład, jeśli danymi wejściowymi są dog i Buddy, wynikiem powinno być:

Buddy says: Woof!

Jeśli danymi wejściowymi są cat i Whiskers, wynikiem powinno być:

Whiskers says: Meow!

Spróbuj swoich sił

-- main.lua
-- Użyj PetFactory do tworzenia zwierzaków

local PetFactory = require('PetFactory')

-- Odczytaj dane wejściowe
local petType = io.read()
local petName = io.read()

-- TODO: Użyj PetFactory.createPet, aby utworzyć zwierzaka
-- TODO: Wywołaj metodę :speak() zwierzaka i wypisz wynik
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Lua online