Menu
CoddyTech

Factory Deseni

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 47 / 65.

Fabrika kalıbı, hangi sınıfın oluşturulacağına ilişkin seçimi tek bir yerde toplar. Programın geri kalanı fabrikadan "bir goblin" ister ve sınıfın adını Goblin olarak belirtmeden bir nesne alır.

Ürünler bir üst sınıfı paylaşır, bu nedenle onları kullanan kod herhangi biriyle çalışır:

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

Fabrika, bir adı nesneye dönüştüren static func içeren bir sınıftır. Dönüş türü üst sınıftır; bu nedenle her tür düşman döndürebilir veya bilmediği bir ad için null döndürebilir:

# 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

Bu tür adlar genellikle verilerden gelir: bir ortaya çıkma tablosu, bir seviye dosyası veya oyuncunun yazdığı bir komut. Bunları sınıflarla eşleştiren tek yer fabrikadır; bu yüzden bir Dragon eklemek için yeni bir dosya ve match içinde yeni bir dal yeterlidir.

Bir fabrika, nesneyi döndürmeden önce de hazırlayabilir; böylece her çağıran kullanıma hazır bir düşman alır:

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), 300 HP'ye sahip bir Orc döndürür.

challenge icon

Görev

Orta

Bir oluşturma tablosu düşmanları ve seviyeleri belirtir. Enemy (enemy.gd) ve onun alt sınıfı Goblin (goblin.gd) yazılmıştır; geri kalanını tamamla:

  • orc.gd dosyasında, _init(level) yapıcısı üst sınıfın yapıcısına adı Orc, 25 * level HP ve 4 + level hasar olarak iletir; Goblin sınıfının yaptığı gibi.
  • enemy_factory.gd dosyasında, static func create(kind, level), goblin için o seviyede oluşturulmuş bir Goblin, orc içinse o seviyede oluşturulmuş bir Orc döndürür. İsimdeki büyük harfler önemli değildir (ORC bir orc'tur). Diğer tüm isimler null döndürür.

Verilen kod, kaç düşman oluşturulacağını okur; ardından her düşman için bir KIND LEVEL satırı okur ve her düşmanı ya da Unknown enemy: KIND mesajını, sonra da oluşturulan düşman sayısını yazdırır. goblin 2, Orc 3 ve slime 1 için çıktı şöyledir:

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

Kodunu enemy_factory.gd ve orc.gd dosyalarına yaz. main.gd verilen giriş/çıkış kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
	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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online GDScript derleyicisi