دوال المصنع
جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 62 من 70.
خلال هذه الدورة، لقد قمت بإنشاء كائنات من خلال استدعاء المنشئات مباشرة—Circle:new()، وRectangle:new()، وهكذا. ولكن ماذا لو كنت تريد إنشاء أنواع مختلفة من الكائنات بناءً على شرط معين، دون أن يحتاج الكود المستدعي إلى معرفة الفئة المحددة التي يجب استخدامها؟
هنا يأتي دور نمط المصنع (Factory pattern). المصنع هو ببساطة دالة تقوم بإنشاء وإرجاع الكائنات. الفائدة الرئيسية هي أن المستدعي لا يحتاج إلى معرفة تفاصيل إنشاء الكائن—فهو يطلب فقط من المصنع ما يحتاجه.
local function createShape(shapeType)
if shapeType == "circle" then
return Circle:new(10)
elseif shapeType == "square" then
return Square:new(5)
end
end
-- لا يحتاج المستدعي إلى معرفة فئات Circle أو Square
local myShape = createShape("circle")
print(myShape:area())
تأخذ دالة المصنع (factory function) وسيطاً نصياً (string argument) وتحدد أي فئة (class) سيتم إنشاؤها. هذا يجمع منطق إنشاء الكائنات في مكان واحد. إذا قمت لاحقاً بإضافة نوع شكل جديد، فستقوم فقط بتعديل المصنع، وليس كل جزء من الكود الذي يقوم بإنشاء الأشكال.
تعتبر المصانع (Factories) مفيدة بشكل خاص عندما يتضمن إنشاء الكائنات إعداداً معقداً، أو عندما ترغب في إخفاء تفاصيل التنفيذ، أو عندما يعتمد النوع الدقيق للكائن على ظروف وقت التشغيل مثل مدخلات المستخدم أو ملفات التكوين.
التحدي
سهللنقم ببناء مصنع للحيوانات الأليفة (Pet Factory)! بدلاً من إنشاء الحيوانات الأليفة مباشرةً عن طريق استدعاء منشئ (constructor) كل فئة، ستقوم بإنشاء دالة مصنع تنتج النوع الصحيح من الحيوانات الأليفة بناءً على وسيط نصي بسيط.
ستقوم بتنظيم الكود الخاص بك عبر أربعة ملفات:
Dog.lua: قم بإنشاء فئة Dog مع منشئ:new(name)يقوم بتخزين اسم الحيوان الأليف. أضف طريقة:speak()تعيد السلسلة النصية"{name} says: Woof!"(حيث {name} هو اسم الكلب).Cat.lua: قم بإنشاء فئة Cat بنفس الهيكل — منشئ:new(name)وطريقة:speak()تعيد"{name} says: Meow!".PetFactory.lua: هذا هو المكان الذي يتألق فيه نمط المصنع (Factory pattern)! قم بإنشاء دالةcreatePet(petType, name)تأخذ وسيطين: سلسلة نصية تشير إلى نوع الحيوان الأليف ("dog"أو"cat") واسم الحيوان الأليف. يجب أن تعيد الدالة كائن الحيوان الأليف المناسب. إذا كان النوع"dog"، فقم بإعادة Dog جديد؛ وإذا كان"cat"، فقم بإعادة Cat جديد.main.lua: اطلب وحدة PetFactory الخاصة بك. اقرأ مدخلين: نوع الحيوان الأليف واسمه. استخدم دالة المصنع الخاصة بك لإنشاء الحيوان الأليف، ثم استدعِ طريقة:speak()الخاصة به واطبع النتيجة.
جمال نمط المصنع هو أن الكود الرئيسي الخاص بك لا يحتاج إلى طلب Dog أو Cat مباشرةً — فهو يعرف فقط عن المصنع. يتولى المصنع جميع تفاصيل الفئة التي يجب إنشاؤها.
ستتلقى مدخلين:
- نوع الحيوان الأليف (إما
"dog"أو"cat") - اسم الحيوان الأليف (سلسلة نصية)
على سبيل المثال، إذا كانت المدخلات هي dog و Buddy، فيجب أن تكون النتيجة:
Buddy says: Woof!إذا كانت المدخلات هي cat و Whiskers، فيجب أن تكون النتيجة:
Whiskers says: Meow!ورقة مرجعية
نمط المصنع (Factory pattern) هو نمط تصميم حيث تقوم دالة بإنشاء وإرجاع كائنات بناءً على معلمات معينة. لا يحتاج المستدعي لمعرفة الفئة المحددة التي يتم إنشاؤها—فالمصنع يتولى هذا القرار.
تقوم دالة المصنع بتركيز منطق إنشاء الكائنات في مكان واحد:
local function createShape(shapeType)
if shapeType == "circle" then
return Circle:new(10)
elseif shapeType == "square" then
return Square:new(5)
end
end
local myShape = createShape("circle")
print(myShape:area())
فوائد نمط المصنع:
- يخفي تفاصيل التنفيذ عن المستدعي
- يركز عملية إنشاء الكائنات في مكان واحد
- يسهل إضافة أنواع جديدة—فقط المصنع يحتاج إلى تعديل
- مفيد عندما يعتمد نوع الكائن على ظروف وقت التشغيل (مدخلات المستخدم، الإعدادات، إلخ.)
- مفيد عندما يتضمن إنشاء الكائن إعدادات معقدة
جرّب بنفسك
-- main.lua
-- استخدم PetFactory لإنشاء الحيوانات الأليفة
local PetFactory = require('PetFactory')
-- قراءة المدخلات
local petType = io.read()
local petName = io.read()
-- TODO: استخدم PetFactory.createPet لإنشاء الحيوان الأليف
-- TODO: استدعِ طريقة :speak() الخاصة بالحيوان الأليف واطبع النتيجة
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال