Menu
CoddyTech
flag Ar iconالعربيةdown icon

نمط Factory

جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 47 من 65.

ينقل نمط Factory اختيار الفئة التي سيتم إنشاؤها إلى مكان واحد. يطلب باقي البرنامج من المصنع «غوبلن» ويحصل على كائن، دون تسمية الفئة Goblin.

تشترك المنتجات في فئة رئيسية، لذا فإن الشيفرة التي تستخدمها تعمل مع أيٍّ منها:

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

المصنع هو صنف يحتوي على static func يحوّل اسمًا إلى كائن. نوع القيمة المُعادة هو الصنف الأب، لذا يمكنه إرجاع أي نوع من الأعداء، أو null لاسم لا يعرفه:

# 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

تأتي أسماء مثل هذه عادةً من البيانات: جدول ظهور، أو ملف مستوى، أو أمر كتبه اللاعب. المصنع هو المكان الوحيد الذي يربطها بالفئات، لذا فإن إضافة Dragon تتطلب ملفًا جديدًا وفرعًا جديدًا في match.

يمكن للمصنع أيضًا إعداد الكائن قبل إرجاعه، بحيث يحصل كل مستدعٍ على عدو جاهز للاستخدام:

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) كائن Orc مع 300 نقطة صحة.

challenge icon

التحدي

متوسط

يحدّد جدول الإنشاء الأعداء والمستويات. تمت كتابة Enemy (enemy.gd) والفئة الفرعية Goblin (goblin.gd)؛ أكمل الباقي:

  • في orc.gd، يمرّر المُنشئ _init(level) الاسم Orc و25 * level نقطة صحة و4 + level من الضرر إلى مُنشئ الفئة الأب، بالطريقة نفسها التي تفعلها Goblin.
  • في enemy_factory.gd، تعيد static func create(kind, level) كائنًا من Goblin عند goblin، وكائنًا من Orc عند orc، ويُنشأ كل منهما باستخدام ذلك المستوى. لا يهم استخدام الأحرف الكبيرة في الاسم (ORC تعني orc). أي اسم آخر يعيد null.

يقرأ الكود المزوّد عدد مرات الإنشاء التالية، ثم سطرًا واحدًا بصيغة KIND LEVEL لكل عملية إنشاء، ويطبع كل عدو أو Unknown enemy: KIND، ثم عدد الأعداء الذين أُنشئوا. بالنسبة إلى goblin 2 وOrc 3 وslime 1، يكون الناتج:

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

ضع الكود في enemy_factory.gd وorc.gd. يحتوي main.gd على كود الإدخال/الإخراج المزوّد، ولا يمكن تعديله.

جرّب بنفسك

extends Node

func _ready():
	# شيفرة الإدخال/الإخراج المقدَّمة: اتركها كما هي
	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 iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجّه

تدرّب بنفسك: مترجم GDScript عبر الإنترنت