פונקציות Factory
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 62 מתוך 70.
לאורך הקורס הזה יצרת אובייקטים באמצעות קריאה ישירה לבנאים: Circle:new(), Rectangle:new() וכן הלאה. אבל מה אם תרצה ליצור סוגים שונים של אובייקטים על סמך תנאי כלשהו, בלי שהקוד הקורא יצטרך לדעת באיזו מחלקה מסוימת להשתמש?
כאן נכנסת לתמונה תבנית Factory. מפעל הוא פשוט פונקציה שיוצרת ומחזירה אובייקטים. היתרון המרכזי הוא שהקורא לא צריך לדעת את הפרטים של יצירת האובייקט. הוא פשוט מבקש מהמפעל את מה שהוא צריך.
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())
פונקציית המפעל מקבלת ארגומנט מסוג מחרוזת ומחליטה איזו מחלקה ליצור. כך לוגיקת יצירת האובייקטים מרוכזת במקום אחד. אם בהמשך תוסיף סוג צורה חדש, יהיה עליך לשנות רק את המפעל, ולא כל קטע קוד שיוצר צורות.
מפעלים שימושיים במיוחד כאשר יצירת אובייקטים כרוכה בהגדרה מורכבת, כשרוצים להסתיר פרטי מימוש, או כאשר הסוג המדויק של האובייקט תלוי בתנאים בזמן ריצה, כמו קלט מהמשתמש או קובצי תצורה.
אתגר
קלבואו נבנה מפעל חיות מחמד! במקום ליצור חיות מחמד ישירות באמצעות קריאה לבנאי של כל מחלקה, תיצרו פונקציית מפעל שמייצרת את סוג חיית המחמד המתאים על סמך ארגומנט מחרוזת פשוט.
תארגנו את הקוד שלכם בארבעה קבצים:
Dog.lua: צרו מחלקת Dog עם בנאי:new(name)ששומר את שם חיית המחמד. הוסיפו מתודת:speak()שמחזירה את המחרוזת"{name} says: Woof!"(כאשר {name} הוא שמה של הכלבה או הכלב).Cat.lua: צרו מחלקת Cat באותו מבנה: בנאי:new(name)ומתודת:speak()שמחזירה את"{name} says: Meow!".PetFactory.lua: כאן תבנית המפעל באה לידי ביטוי! צרו פונקציהcreatePet(petType, name)שמקבלת שני ארגומנטים: מחרוזת המציינת את סוג חיית המחמד ("dog"או"cat") ואת שם חיית המחמד. הפונקציה צריכה להחזיר את אובייקט חיית המחמד המתאים. אם הסוג הוא"dog", החזירו כלב חדש; אם הוא"cat", החזירו חתול חדש.main.lua: טענו את המודול PetFactory. קראו שתי קלטים: סוג חיית המחמד ושמה. השתמשו בפונקציית המפעל כדי ליצור את חיית המחמד, ואז קראו למתודת:speak()שלה והדפיסו את התוצאה.
היופי בתבנית המפעל הוא שהקוד הראשי שלכם לא צריך לטעון ישירות את Dog או את Cat. הוא מכיר רק את המפעל. המפעל מטפל בכל הפרטים של בחירת המחלקה לאתחול.
תקבלו שתי קלטים:
- סוג חיית המחמד (או
"dog"או"cat") - שם חיית המחמד (מחרוזת)
לדוגמה, אם הקלטים הם dog ו-Buddy, הפלט צריך להיות:
Buddy says: Woof!אם הקלטים הם cat ו-Whiskers, הפלט צריך להיות:
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פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין