نمط 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 نقطة صحة.
التحدي
متوسطيحدّد جدول الإنشاء الأعداء والمستويات. تمت كتابة 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)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت