CodeGym /בלוג Java /Random-HE /דפוס עיצוב במפעל
John Squirrels
רָמָה
San Francisco

דפוס עיצוב במפעל

פורסם בקבוצה
שלום חבר! היום נמשיך ללמוד דפוסי עיצוב. בשיעור זה, נדבר על מפעלים. נדון בבעיה שדפוס זה פותר ונראה דוגמה כיצד מפעל יכול לעזור לך לפתוח בית קפה. בנוסף, אתן לך 5 שלבים פשוטים ליצירת מפעל. דפוס עיצוב במפעל - 1 כדי לוודא שכולנו נמצאים על אותו אורך גל ושתבינו במהירות את המושג הזה, כדאי שתכירו את הנושאים הבאים:
  • ירושה בג'אווה
  • צמצום והרחבה של סוגי הפניות ב-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השיטה לשני חלקים:
  1. יצירת מופע ספציפי של קפה בהצהרה switch. זה המקום שבו מפעל עושה את מה שהוא עושה - יוצר סוג מסוים בהתאם לתנאים.
  2. הכנה - זוהי הטחינה, הבישול והמזיגה לספל.
הנה מה שחשוב לדעת אם תצטרך לבצע שינויים בשיטה בעתיד:
  1. השלבים הכרוכים בהכנה עצמה (טחינה, חליטה ומזיגה לספל) יישארו ללא שינוי (לפחות אנחנו בונים על זה).
  2. אבל מבחר סוגי הקפה עשוי להשתנות. אולי נתחיל להכין מוקה... Frappu... Mochacci... מה שלא יהיה, סוג חדש של קפה.
אנחנו כבר יכולים להיות בטוחים למדי שבעתיד נצטרך לבצע שינויים בהצהרת השיטה switch. יתכן גם שבבית הקפה שלנו orderCoffeeהשיטה לא תהיה המקום היחיד בו ניצור סוגי קפה שונים. כתוצאה מכך, יהיה צורך לבצע שינויים במספר מקומות. אתה בטח כבר מבין למה אני מתכוון. אנחנו צריכים לעשות מחדש. העבר את הבלוק האחראי ליצירת קפה למחלקה נפרדת משתי סיבות:
  1. אנחנו יכולים לעשות שימוש חוזר בהיגיון הכנת הקפה במקומות אחרים.
  2. אם המבחר משתנה, לא נצטרך לערוך את הקוד בכל מקום שבו נוצר קפה. זה יספיק לשנות את הקוד שלנו במקום אחד בלבד.
במילים אחרות, הגיע הזמן להקים מפעל.

הקמת המפעל הראשון שלנו

לשם כך, ניצור מחלקה חדשה שתהיה אחראית רק ליצירת המקרים הדרושים של שיעורי קפה:
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השיטה סטטית. אבל אז נאבד שתי יכולות:
  1. היכולת לרשת SimpleCoffeeFactoryולעקוף את createCoffeeהשיטה.
  2. היכולת להוסיף את היישום המפעל הנדרש לשיעורים שלנו.
אגב, אם כבר מדברים על יישום... צריך לחזור לבית הקפה ולהוסיף את מפעל הכנת הקפה שלנו.

הוספת מפעל לבית הקפה

בואו נשכתב מחדש את שיעור בית הקפה באמצעות מפעל:
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שלב 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;
        }
    }
עכשיו אתה יכול לנהל מפעל כמו בוס. :)

איך להתאמן

קריאה טובה, כתיבת קוד אפילו טובה יותר. אם השם שלך כולל מספר זוגי של אותיות, נסה ליצור פיצרייה וירטואלית משלך. אם השם שלך כולל מספר אי זוגי של אותיות, נסה ליצור סושי בר וירטואלי. אם אין לך שם, התמזל מזלך. היום אתה יכול להירגע.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION