שלום חבר! היום נמשיך ללמוד דפוסי עיצוב. בשיעור זה, נדבר על מפעלים. נדון בבעיה שדפוס זה פותר ונראה דוגמה כיצד מפעל יכול לעזור לך לפתוח בית קפה. בנוסף, אתן לך 5 שלבים פשוטים ליצירת מפעל. כדי לוודא שכולנו נמצאים על אותו אורך גל ושתבינו במהירות את המושג הזה, כדאי שתכירו את הנושאים הבאים:
- ירושה בג'אווה
- צמצום והרחבה של סוגי הפניות ב-Java
- אינטראקציה בין מחלקות ואובייקטים שונים.
מה זה מפעל?
תבנית העיצוב של המפעל מאפשרת לך לשלוט ביצירת אובייקטים. תהליך יצירת אובייקט חדש אינו סופר פשוט, אך גם לא מסובך מדי. כולנו יודעים שאנחנו צריכים אתnew
האופרטור כדי ליצור אובייקט חדש. אולי נראה שאין כאן מה לשלוט, אבל זה לא נכון. נניח שלאפליקציה שלנו יש מחלקה מסוימת שיש לה הרבה צאצאים. קשיים יכולים להתעורר כאשר יש צורך ליצור מופע של מחלקה ספציפית בהתאם לתנאים מסוימים. מפעל הוא דפוס עיצובי שעוזר לפתור את הבעיה של יצירת חפצים שונים בהתאם לתנאים מסוימים . איך זה למושג מופשט? זה יהיה ברור וספציפי יותר כאשר נסתכל על הדוגמה למטה.
בואו להכין סוגים שונים של קפה
נניח שאנחנו רוצים להפוך בית קפה לאוטומטי. אנחנו צריכים ללמד את התוכנית שלנו איך להכין סוגים שונים של קפה. לשם כך ניצור כיתת קפה וכמה כיתות נגזרות לייצג את סוגי הקפה שנכין: אמריקנו, קפוצ'ינו, אספרסו ולאטה. נתחיל בשיעור קפה כללי:public class Coffee {
public void grindCoffee(){
// Grind the coffee
}
public void makeCoffee(){
// Brew the coffee
}
public void pourIntoCup(){
// Pour into a cup
}
}
לאחר מכן, ניצור את כיתות הילד שלו:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
לקוחותינו יכולים להזמין כל סוג של קפה. יש להעביר את ההזמנות שלהם לתוכנית. ניתן לעשות זאת בדרכים רבות, למשל באמצעות String
. אבל זה enum
הכי טוב בשביל זה. אנו ניצור enum
ונגדיר שדות מנה התואמים לסוגי הקפה שניתן להזמין:
public enum CoffeeType {
ESPRESSO,
AMERICANO,
CAFFE_LATTE,
CAPPUCCINO
}
גדול. כעת נכתוב את הקוד לבית הקפה שלנו:
public class CoffeeShop {
public Coffee orderCoffee(CoffeeType type) {
Coffee coffee = null;
switch (type) {
case AMERICANO:
coffee = new Americano();
break;
case ESPRESSO:
coffee = new Espresso();
break;
case CAPPUCCINO:
coffee = new Cappucсino();
break;
case CAFFE_LATTE:
coffee = new CaffeLatte();
break;
}
coffee.grindCoffee();
coffee.makeCoffee();
coffee.pourIntoCup();
System.out.println("Here's your coffee! Thanks! Come again!");
return coffee;
}
}
ניתן לחלק את orderCoffee
השיטה לשני חלקים:
- יצירת מופע ספציפי של קפה בהצהרה
switch
. זה המקום שבו מפעל עושה את מה שהוא עושה - יוצר סוג מסוים בהתאם לתנאים. - הכנה - זוהי הטחינה, הבישול והמזיגה לספל.
- השלבים הכרוכים בהכנה עצמה (טחינה, חליטה ומזיגה לספל) יישארו ללא שינוי (לפחות אנחנו בונים על זה).
- אבל מבחר סוגי הקפה עשוי להשתנות. אולי נתחיל להכין מוקה... Frappu... Mochacci... מה שלא יהיה, סוג חדש של קפה.
switch
. יתכן גם שבבית הקפה שלנו orderCoffee
השיטה לא תהיה המקום היחיד בו ניצור סוגי קפה שונים. כתוצאה מכך, יהיה צורך לבצע שינויים במספר מקומות. אתה בטח כבר מבין למה אני מתכוון. אנחנו צריכים לעשות מחדש. העבר את הבלוק האחראי ליצירת קפה למחלקה נפרדת משתי סיבות:
- אנחנו יכולים לעשות שימוש חוזר בהיגיון הכנת הקפה במקומות אחרים.
- אם המבחר משתנה, לא נצטרך לערוך את הקוד בכל מקום שבו נוצר קפה. זה יספיק לשנות את הקוד שלנו במקום אחד בלבד.
הקמת המפעל הראשון שלנו
לשם כך, ניצור מחלקה חדשה שתהיה אחראית רק ליצירת המקרים הדרושים של שיעורי קפה:public class SimpleCoffeeFactory {
public Coffee createCoffee(CoffeeType type) {
Coffee coffee = null;
switch (type) {
case AMERICANO:
coffee = new Americano();
break;
case ESPRESSO:
coffee = new Espresso();
break;
case CAPPUCCINO:
coffee = new Cappucino();
break;
case CAFFE_LATTE:
coffee = new CaffeLatte();
break;
}
return coffee;
}
}
מזל טוב! זה עתה יישמנו את תבנית עיצוב המפעל בצורתו הפשוטה ביותר (כמעט). זה היה יכול להיות אפילו יותר פשוט אם היינו עושים את createCoffee
השיטה סטטית. אבל אז נאבד שתי יכולות:
- היכולת לרשת
SimpleCoffeeFactory
ולעקוף אתcreateCoffee
השיטה. - היכולת להוסיף את היישום המפעל הנדרש לשיעורים שלנו.
הוספת מפעל לבית הקפה
בואו נשכתב מחדש את שיעור בית הקפה באמצעות מפעל:public class CoffeeShop {
private final SimpleCoffeeFactory coffeeFactory;
public CoffeeShop(SimpleCoffeeFactory coffeeFactory) {
this.coffeeFactory = coffeeFactory;
}
public Coffee orderCoffee(CoffeeType type) {
Coffee coffee = coffeeFactory.createCoffee(type);
coffee.grindCoffee();
coffee.makeCoffee();
coffee.pourIntoCup();
System.out.println("Here's your coffee! Thanks! Come again!");
return coffee;
}
}
מְעוּלֶה. כעת נספק תיאור תמציתי של המבנה הכללי של דפוס עיצוב המפעל.
5 שלבים לפתיחת מפעל משלך
שלב 1. לתוכנית שלך יש כיתה עם כמה צאצאים, כמו בתרשים שלהלן: שלב 2. אתה יוצר שדהenum
עם שדה לכל כיתת ילד:
enum CatType {
LION,
TIGER,
FLUFFY
}
שלב 3. בנה את המפעל שלך. קורא לזה CatFactory
. הנה הקוד:
class CatFactory {}
שלב 4. במפעל שלך, צור createCat
שיטה שלוקחת CatType
טיעון. הנה הקוד:
class CatFactory {
public Cat createCat(CatType type) {
}
}
שלב 5. בגוף השיטה, כתוב switch
משפט המונה את שדות ה-enum ויוצר מופע של המחלקה שמתאים לערך שעבר enum
:
class CatFactory {
public Cat createCat(CatType type) {
Cat cat = null;
switch (type) {
case LION:
cat = new Fluffy();
break;
case TIGER:
cat = new Tiger();
break;
case FLUFFY:
cat = new Lion();
break;
}
return cat;
}
}
עכשיו אתה יכול לנהל מפעל כמו בוס. :)
GO TO FULL VERSION