دوال المصنع
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 62 من 70.
على مدار هذه الدورة، أنشأتَ كائنات من خلال استدعاء المُنشئات مباشرةً: Circle:new() وRectangle:new() وما إلى ذلك. ولكن ماذا لو أردت إنشاء أنواع مختلفة من الكائنات بناءً على شرطٍ ما، من دون أن تحتاج الشيفرة التي تجري الاستدعاء إلى معرفة الفئة المحددة التي ينبغي استخدامها؟
هنا يأتي دور نمط Factory. فالمصنع هو ببساطة function تنشئ الكائنات وتعيدها. وتتمثل الفائدة الأساسية في أن caller doesn't need know تفاصيل إنشاء object. فهو يطلب ببساطة من المصنع ما يحتاج إليه.
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())
تأخذ دالة المصنع وسيطًا من النوع string وتقرر أي class سيتم إنشاء مثيل له. وهذا يركّز منطق إنشاء object في مكان واحد. إذا أضفت لاحقًا نوعًا جديدًا من الأشكال، فلن تحتاج إلى تعديل سوى factory، وليس كل جزء من الشيفرة التي تنشئ الأشكال.
تُعدّ المصانع مفيدةً بشكل خاص عندما يتضمن إنشاء الكائن إعدادًا معقدًا، أو عندما تريد إخفاء تفاصيل التنفيذ، أو عندما يعتمد النوع الدقيق للكائن على شروط وقت التشغيل مثل إدخال المستخدم أو ملفات التكوين.
التحدي
سهللنَبْنِ Pet Factory! بدلًا من إنشاء pets مباشرةً عن طريق استدعاء constructor الخاص بكل class، ستنشئ function للمصنع تنتج النوع المناسب من pet استنادًا إلى وسيط string بسيط.
ستنظّم code الخاص بك عبر أربعة files:
Dog.lua: أنشئ class باسم Dog مع constructor هو:new(name)يخزّن اسم pet. أضف method باسم:speak()يعيد string"{name} says: Woof!"(حيث إن {name} هو اسم الكلب).Cat.lua: أنشئ class باسم Cat بالبنية نفسها: constructor هو:new(name)وmethod باسم:speak()يعيد"{name} says: Meow!".PetFactory.lua: هنا تتألق Factory pattern! أنشئ function باسمcreatePet(petType, name)يأخذ وسيطين: string يشير إلى نوع pet ("dog"أو"cat") واسم pet. يجب أن تعيد function كائن pet المناسب. إذا كان النوع هو"dog"، فأعد Dog جديدًا؛ وإذا كان"cat"، فأعد Cat جديدة.main.lua: استخدم require لوحدة PetFactory. اقرأ مدخلين: نوع pet واسم pet. استخدم function الخاصة بالمصنع لإنشاء pet، ثم استدعِ method:speak()الخاصة بها واطبع result.
يكمن جمال Factory pattern في أن code الرئيسي الخاص بك لا يحتاج إلى require لـ Dog أو Cat مباشرةً. فهو يعرف فقط factory. ويتولى المصنع جميع تفاصيل class التي ينبغي إنشاء instance منها.
ستتلقى مدخلين:
- نوع Pet (إما
"dog"أو"cat") - اسم Pet (وهو string)
على سبيل المثال، إذا كانت inputs هي dog وBuddy، فيجب أن يكون output:
Buddy says: Woof!إذا كانت inputs هي cat وWhiskers، فيجب أن يكون output:
Whiskers says: Meow!جرّب بنفسك
-- main.lua
-- استخدم PetFactory لإنشاء الحيوانات الأليفة
local PetFactory = require('PetFactory')
-- اقرأ المدخلات
local petType = io.read()
local petName = io.read()
-- TODO: استخدم PetFactory.createPet لإنشاء الحيوان الأليف
-- TODO: استدعِ دالة :speak() الخاصة بالحيوان الأليف واطبع النتيجة
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكالتدرّب بنفسك: مترجم Lua عبر الإنترنت