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: slimeNama 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 bossEnemyFactory.create_boss("orc", 3) mengembalikan sebuah Orc dengan 300 HP.
Tantangan
SedangTabel 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 namaOrc, HP25 * level, dan damage4 + levelke konstruktor induk, seperti yang dilakukanGoblin. - Di
enemy_factory.gd,static func create(kind, level)mengembalikanGoblinuntukgoblindanOrcuntukorc, yang dibuat dengan level tersebut. Huruf besar atau kecil pada nama tidak berpengaruh (ORCadalah orc). Nama lainnya mengembalikannull.
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: 2Tulis 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)
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass dan objectKata Kunci selfmethodpropertyKonstruktor (_init)Ringkasan: Kalkulator Sederhana4Polimorfisme
Method Overriding Sekali LagiDuck TypingKelas Abstrak dan MethodDesain InterfaceRingkasan: Kalkulator Bentuk7Sinyal
Apa itu Sinyal?Mendeklarasikan dan MemancarkanMenghubungkan ke SinyalSinyal dengan ArgumenRangkuman, Sistem Kesehatan10Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola Composite2Property class
Variabel instance vs. variabel statisFungsi statisSetter propertyGetter propertyPrivat berdasarkan konvensiRangkuman: Pengelola Rekening Bank5Enkapsulasi
Member Publik dan PrivatValidasi dengan SetterPenyembunyian InformasiProperty Hanya-BacaRingkasan: Sistem Catatan Siswa8Konsep OOP Lanjutan
Komposisi vs PewarisanInner ClassNode sebagai KomponenRefCounted vs NodeEnum dalam Class11Proyek: Manajemen Perpustakaan
Gambaran Umum Proyekclass Buku dan PenggunaLatihan sendiri: Compiler GDScript online