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: slimeBu 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 bossEnemyFactory.create_boss("orc", 3), 300 HP'ye sahip bir Orc döndürür.
Görev
OrtaBir 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.gddosyası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;Goblinsınıfının yaptığı gibi.enemy_factory.gddosyasında,static func create(kind, level),gobliniçin o seviyede oluşturulmuş birGoblin,orciçinse o seviyede oluşturulmuş birOrcdöndürür. İsimdeki büyük harfler önemli değildir (ORCbir orc'tur). Diğer tüm isimlernulldö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: 2Kodunu 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)
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
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarNesne Yönelimli Programlamaya GirişSınıflar ve Nesnelerself Anahtar KelimesiMetotlarÖzelliklerKurucu (_init)Tekrar - Basit Hesap Makinesi4Çok Biçimlilik
Metot Ezme Konusuna Yeniden BakışÖrdek TiplemesiSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı7Sinyaller
Sinyal Nedir?Tanımlama ve Sinyal GöndermeSinyallere BağlanmaArgümanlı SinyallerTekrar - Sağlık Sistemi10Tasarım Kalıpları 2. Bölüm
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik Kalıp2Sınıf Özellikleri
Örnek ve Statik DeğişkenlerStatik FonksiyonlarÖzellik AyarlayıcılarıÖzellik AlıcılarıGeleneksel Olarak ÖzelTekrar - Banka Hesabı Yöneticisi5Kapsülleme
Public ve Private ÜyelerSetter'larla DoğrulamaBilgi GizlemeSalt Okunur ÖzelliklerTekrar - Öğrenci Kayıt Sistemi3Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz KılmaKalıtım Zincirleriis ile Tür KontrolleriTekrar: Çalışan Hiyerarşisi9Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online GDScript derleyicisi