Mẫu Factory
Thuộc phần Lập trình hướng đối tượng trong hành trình GDScript của Coddy. Bài học 47 trên 65.
Mẫu Factory gom việc chọn lớp cần tạo vào một nơi. Phần còn lại của chương trình yêu cầu factory tạo ra “một goblin” và nhận lại một đối tượng, mà không cần gọi tên lớp Goblin.
Các sản phẩm cùng kế thừa một lớp cha, vì vậy code sử dụng chúng có thể hoạt động với bất kỳ sản phẩm nào:
# 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"Nhà máy là một lớp có static func biến tên thành một đối tượng. Kiểu trả về của hàm là lớp cha, vì vậy hàm có thể trả về bất kỳ loại kẻ địch nào, hoặc null nếu không nhận ra tên:
# 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: slimeNhững tên như thế này thường lấy từ dữ liệu: bảng sinh quái, tệp màn chơi hoặc lệnh người chơi đã nhập. Factory là nơi duy nhất ánh xạ các tên đó sang lớp, nên để thêm Dragon, bạn chỉ cần tạo một tệp mới và thêm một nhánh mới trong match.
Một factory cũng có thể thiết lập đối tượng trước khi trả về, để mọi bên gọi đều nhận được một kẻ địch sẵn sàng sử dụng:
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) trả về một Orc có 300 HP.
Thử thách
Trung bìnhBảng xuất hiện ghi tên kẻ địch và cấp độ. Enemy (enemy.gd) và lớp con Goblin (goblin.gd) đã được viết; hãy hoàn thành phần còn lại:
- Trong
orc.gd, hàm khởi tạo_init(level)truyền tênOrc,25 * levelHP và4 + levelsát thương cho hàm khởi tạo của lớp cha, giống nhưGoblin. - Trong
enemy_factory.gd,static func create(kind, level)trả về mộtGoblinchogoblinvà mộtOrcchoorc, được tạo với cấp độ đó. Chữ hoa trong tên không quan trọng (ORClà một orc). Tên khác sẽ trả vềnull.
Code được cung cấp đọc số lượng kẻ địch sẽ xuất hiện, sau đó đọc một dòng KIND LEVEL cho mỗi kẻ địch và in thông tin của từng kẻ địch hoặc Unknown enemy: KIND, rồi in số lượng kẻ địch đã xuất hiện. Với goblin 2, Orc 3 và slime 1, đầu ra là:
Goblin: 20 HP, 4 damage
Orc: 75 HP, 7 damage
Unknown enemy: slime
Spawned: 2Code của bạn nằm trong enemy_factory.gd và orc.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
extends Node
func _ready():
# Đoạn code đầu vào/đầu ra đã được cung cấp: giữ nguyê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)
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa selfPhương thứcThuộc tínhHàm khởi tạo (_init)Ôn tập: máy tính đơn giản4Tính đa hình
Xem lại cách ghi đè phương thứcĐịnh kiểu vịtLớp và phương thức trừu tượngThiết kế interfaceÔn tập: máy tính hình học7Tín hiệu
Tín hiệu là gì?Khai báo và phát tín hiệuKết nối với tín hiệuTín hiệu có đối sốÔn tập: hệ thống sức khỏe10Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổng hợp2Thuộc tính của lớp
Biến instance và biến staticHàm staticPhương thức thiết lập thuộc tínhPhương thức lấy thuộc tínhQuy ước về tính riêng tưÔn tập: trình quản lý tài khoản ngân hàng5Tính đóng gói
Thành viên công khai và riêng tưXác thực bằng phương thức setterẨn thông tinThuộc tính chỉ đọcÔn tập: hệ thống hồ sơ học sinh8Khái niệm OOP nâng cao
Kết hợp và kế thừaLớp bên trongNode dưới dạng thành phầnRefCounted và NodeEnum trong lớpTự luyện tập: Trình biên dịch GDScript online