Wzorzec Factory
Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 47 z 65.
Wzorzec Factory przenosi wybór klasy do utworzenia w jedno miejsce. Reszta programu prosi fabrykę o „goblina” i otrzymuje obiekt, nie podając nazwy klasy Goblin.
Produkty mają wspólną klasę nadrzędną, więc kod, który z nich korzysta, działa z każdym z nich:
# enemy.gd
class_name Enemy
extends RefCounted
var hp := 10
func attack() -> String:
return "The enemy waits"# goblin.gd
class_name Goblin
extends Enemy
func attack() -> String:
return "The goblin stabs"# orc.gd
class_name Orc
extends Enemy
func attack() -> String:
return "The orc smashes"Fabryka to klasa ze static func, która zamienia nazwę na obiekt. Jej typ zwracany to klasa nadrzędna, więc może zwrócić dowolny rodzaj przeciwnika albo null dla nazwy, której nie zna:
# enemy_factory.gd
class_name EnemyFactory
extends RefCounted
static func create(kind: String) -> Enemy:
match kind:
"goblin":
return Goblin.new()
"orc":
return Orc.new()
return null# main.gd
for kind in ["orc", "goblin", "slime"]:
var enemy := EnemyFactory.create(kind)
if enemy == null:
print("Unknown enemy: ", kind)
else:
print(enemy.attack())The orc smashes
The goblin stabs
Unknown enemy: slimeTakie nazwy zwykle pochodzą z danych: tabeli pojawiania się, pliku poziomu lub polecenia wpisanego przez gracza. Fabryka to jedyne miejsce, które mapuje je na klasy, więc dodanie Dragon wymaga jednego nowego pliku i jednej nowej gałęzi w match.
Fabryka może również skonfigurować obiekt przed jego zwróceniem, dzięki czemu każdy wywołujący otrzymuje przeciwnika gotowego do użycia:
static func create_boss(kind: String, level: int) -> Enemy:
var boss := create(kind)
if boss != null:
boss.hp = 100 * level
return bossEnemyFactory.create_boss("orc", 3) zwraca Orc z 300 HP.
Wyzwanie
ŚredniTabela tworzenia wrogów zawiera ich nazwy i poziomy. Klasa Enemy (enemy.gd) i jej podklasa Goblin (goblin.gd) są już napisane; dokończ resztę:
- W pliku
orc.gdkonstruktor_init(level)przekazuje do konstruktora klasy nadrzędnej nazwęOrc, 25 punktów HP pomnożone przez poziom oraz obrażenia równe 4 plus poziom — tak jak robi toGoblin. - W pliku
enemy_factory.gdfunkcjastatic func create(kind, level)zwracaGoblindlagobliniOrcdlaorc, utworzonych z podanym poziomem. Wielkość liter w nazwie nie ma znaczenia (ORCto orc). Każda inna nazwa zwracanull.
Dostarczony kod odczytuje liczbę kolejnych wrogów do utworzenia, a następnie jeden wiersz KIND LEVEL dla każdego z nich, i wypisuje każdego wroga lub Unknown enemy: KIND, a potem liczbę utworzonych wrogów. Dla goblin 2, Orc 3 i slime 1 wynikiem jest:
Goblin: 20 HP, 4 damage
Orc: 75 HP, 7 damage
Unknown enemy: slime
Spawned: 2Twój kod umieść w plikach enemy_factory.gd i orc.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
extends Node
func _ready():
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
var spawned := 0
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
var enemy := EnemyFactory.create(parts[0], int(parts[1]))
if enemy == null:
print("Unknown enemy: ", parts[0])
else:
spawned += 1
print(enemy.describe())
print("Spawned: ", spawned)
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator GDScript online