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

- وراثت در جاوا
- محدود کردن و گسترش انواع مرجع در جاوا
- تعامل بین کلاس ها و اشیاء مختلف.
کارخانه چیست؟
الگوی طراحی کارخانه به شما امکان می دهد ایجاد اشیاء را کنترل کنید. فرآیند ایجاد یک شی جدید بسیار ساده نیست، اما بیش از حد پیچیده هم نیست.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
را می توان به دو بخش تقسیم کرد:
- ایجاد یک نمونه خاص از قهوه در یک
switch
بیانیه. اینجا جایی است که یک کارخانه کاری را که انجام می دهد انجام می دهد - بسته به شرایط یک نوع خاص ایجاد می کند. - آماده سازی - این آسیاب کردن، دم کردن و ریختن در یک فنجان است.
- مراحل مربوط به خود آماده سازی (آسیاب کردن، دم کردن و ریختن در فنجان) بدون تغییر باقی می ماند (حداقل روی این حساب می کنیم).
- اما مجموعه قهوه ها ممکن است تغییر کند. شاید شروع کنیم به درست کردن موکا... فراپو... موکاچی... هر چه باشد، نوع جدیدی از قهوه.
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. برنامه شما دارای یک کلاس با چندین فرزند است، مانند نمودار زیر:
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