CodeGym /وبلاگ جاوا /Random-FA /الگوی طراحی کارخانه
John Squirrels
مرحله
San Francisco

الگوی طراحی کارخانه

در گروه منتشر شد
سلام رفیق! امروز ما به مطالعه الگوهای طراحی ادامه خواهیم داد. در این درس، ما در مورد کارخانه ها صحبت می کنیم. ما در مورد مشکلی که این الگو حل می کند صحبت خواهیم کرد و به مثالی نگاه خواهیم کرد که چگونه یک کارخانه می تواند به شما در راه اندازی یک کافی شاپ کمک کند. علاوه بر این، من 5 مرحله ساده را برای ایجاد یک کارخانه به شما ارائه می دهم. الگوی طراحی کارخانه - 1 برای اطمینان از اینکه همه ما در یک طول موج هستیم و به سرعت این مفهوم را درک خواهید کرد، باید با موضوعات زیر آشنا باشید:
  • وراثت در جاوا
  • محدود کردن و گسترش انواع مرجع در جاوا
  • تعامل بین کلاس ها و اشیاء مختلف.

کارخانه چیست؟

الگوی طراحی کارخانه به شما امکان می دهد ایجاد اشیاء را کنترل کنید. فرآیند ایجاد یک شی جدید بسیار ساده نیست، اما بیش از حد پیچیده هم نیست. 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فیلد 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. اما مجموعه قهوه ها ممکن است تغییر کند. شاید شروع کنیم به درست کردن موکا... فراپو... موکاچی... هر چه باشد، نوع جدیدی از قهوه.
در حال حاضر می توانیم نسبتاً مطمئن باشیم که در آینده باید تغییراتی در 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