Menu
CoddyTech

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: slime

Takie 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 boss

EnemyFactory.create_boss("orc", 3) zwraca Orc z 300 HP.

challenge icon

Wyzwanie

Średni

Tabela 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.gd konstruktor _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 to Goblin.
  • W pliku enemy_factory.gd funkcja static func create(kind, level) zwraca Goblin dla goblin i Orc dla orc, utworzonych z podanym poziomem. Wielkość liter w nazwie nie ma znaczenia (ORC to orc). Każda inna nazwa zwraca null.

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: 2

Twó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)
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 GDScript online