Menu
CoddyTech

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: slime

Nhữ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 boss

EnemyFactory.create_boss("orc", 3) trả về một Orc có 300 HP.

challenge icon

Thử thách

Trung bình

Bả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ên Orc, 25 * level HP và 4 + level sá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ột Goblin cho goblin và một Orc cho orc, được tạo với cấp độ đó. Chữ hoa trong tên không quan trọng (ORC là 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: 2

Code 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)
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch GDScript online