Menu
CoddyTech

Pola Factory

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 47 dari 65.

Pola Factory memusatkan pilihan class yang akan dibuat di satu tempat. Bagian program lainnya meminta factory untuk membuat "a goblin" dan menerima object, tanpa menyebut nama class Goblin.

Produk-produk tersebut memiliki class induk yang sama, jadi kode yang menggunakannya bisa digunakan dengan produk mana pun:

# 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"

Factory adalah sebuah class dengan static func yang mengubah nama menjadi object. Tipe nilai yang dikembalikannya adalah class induk, jadi factory dapat mengembalikan enemy jenis apa pun, atau null untuk nama yang tidak dikenal:

# 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

Nama seperti ini biasanya berasal dari data: tabel kemunculan, file level, atau perintah yang diketik pemain. Factory adalah satu-satunya tempat yang memetakan nama-nama tersebut ke class, jadi menambahkan Dragon hanya memerlukan satu file baru dan satu cabang baru di match.

Factory juga dapat menyiapkan object sebelum mengembalikannya, sehingga setiap pemanggil mendapatkan musuh yang siap digunakan:

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) mengembalikan sebuah Orc dengan 300 HP.

challenge icon

Tantangan

Sedang

Tabel spawn mencantumkan nama musuh dan level. Enemy (enemy.gd) dan subclass-nya Goblin (goblin.gd) sudah ditulis, selesaikan sisanya:

  • Di orc.gd, konstruktor _init(level) meneruskan nama Orc, HP 25 * level, dan damage 4 + level ke konstruktor induk, seperti yang dilakukan Goblin.
  • Di enemy_factory.gd, static func create(kind, level) mengembalikan Goblin untuk goblin dan Orc untuk orc, yang dibuat dengan level tersebut. Huruf besar atau kecil pada nama tidak berpengaruh (ORC adalah orc). Nama lainnya mengembalikan null.

Kode yang disediakan membaca jumlah spawn berikutnya, lalu satu baris KIND LEVEL untuk setiap spawn, dan mencetak setiap musuh atau Unknown enemy: KIND, lalu jumlah musuh yang di-spawn. Untuk goblin 2, Orc 3, dan slime 1, output-nya adalah:

Goblin: 20 HP, 4 damage
Orc: 75 HP, 7 damage
Unknown enemy: slime
Spawned: 2

Tulis kodemu di enemy_factory.gd dan orc.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan tetap seperti semula
	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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online