حوزه: Object
هدف: Creational
نقش الگو
همانطور که در الگوی طراحی Factory Method مشاهده شد، این الگو یک عیب دارد، آن هم این است که از کدام Creator باید استفاده شود و مستقیما در کد بایستی ذکر شود. برای حل این مشکل میتوانیم سراغ الگوی طراحی دیگری برویم که Abstract Factory نام دارد. این الگوی طراحی 4 بخش اصلی دارد.
- Abstract Factory
- Concrete Factory
- Abstract Product
- Concrete Product
شرح الگو
صنعت خودروسازی را در نظر بگیرید که در آن خودروها را در دو دستهی دیزلی و سواری تولید میکنند و دو کارخانهی تولید خودرو که در صنعت خودرو سازی فعالیت دارند. به عنوان مثال، ایران خودرو و سایپا که هر کدام خودروهای خود را تولید میکنند. ولی هر خودرویی که تولید میکنند یا دیزلی است یا سواری. شرکت ایران خودرو، خودروی آرنا را بعنوان دیزلی تولید میکند و پژو 206 را بعنوان سواری. همچنین شرکت سایپا خودروی فوتون را بعنوان خودروی دیزلی تولید میکند و خودروی پراید را بعنوان خودروی سواری. خودروهای تولیدی همانطور که گفته شد یا دیزلی هستند یا سواری که هر کدام از این خودروها ویژگیهای خاص خود را دارند. در بین این خودروها، خودروی پژو 206 و پراید یک خودروی سواری هستند و خودروی فوتون و آرنا، خودروهای دیزلی.
الگوی طراحی Abstract Factory شبیه به نمایشگاه خوردو میباشد که هر دو گروه نوع خودرو از هر دو شرکت سازنده را برای فروش دارد و به درخواست مشتری خودروی مورد نظر را ارائه میکند.
طراحی الگو
طراحی مشابه الگوی Factory Method دارد فقط ایراد موجود در آن از بین رفته است و برای ساخت آبجکتهای مختلف از Innterfaceها یا Abstract Classها استفاده میکنیم.
مزایای Abstract Factory:
- پیاده سازی و نامگذاری Product در Factory مربوطه متمرکز میشود و بدین ترتیب Client به نام و نحوه پیاده سازی Typeهای مختلف Product وابستگی نخواهد داشت.
- به راحتی میتوان Concrete Factory مورد استفاده در برنامه را تغییر داد، بدون اینکه تاثیری در عملکرد سایر بخشها داشته باشد.
- در مواردی که بیش از یک محصول برای هر خانواده وجود داشته باشد، استفاده از Abstract Factory تضمین میکند که Productهای هر خانواده همه در کنار هم قرار دارند و با هم فعال و غیر فعال میشوند. (یا همه، یا هیچکدام)
بزرگترین عیبی که این الگوی طراحی دارد این است که با اضافه شدن فقط یک Product تازه، Abstract Factory باید تغییر کند که این مساله منجر به تغییر همه Concrete Factoryها میشود.
در استفاده از این الگوی طراحی به این تکنیکها توجه داشته باشید:
- Factoryها معمولا Singleton هستند. زیرا هر Application بطور معمول فقط به یک instance از هر Concrete Factory نیاز دارد.
- انتخاب Concrete Factory مناسب معمولا توسط پارامترهایی انجام میشود.
پیاده سازی، مثال:
public interface IDiesel {
String getName();
}
public interface IMotorCar {
String getName();
}
public interface IVehicleFactory {
IDiesel getDiesel();
IMotorCar getMotorCar();
}
public class Saipa implements IVehicleFactory {
public IDiesel getDiesel() {
return new Foton();
}
public IMotorCar getMotorCar() {
return new Peride();
}
}
public class IranKhodro implements IVehicleFactory {
public IDiesel getDiesel() {
return new Arena();
}
public IMotorCar getMotorCar() {
return new Peugeot206();
}
}
public class Arena implements IDiesel {
public String getName() {
return "This is Arena";
}
}
public class Foton implements IDiesel {
public String getName() {
return "This is Foto";
}
}
public class Peride implements IMotorCar {
public String getName() {
return "This is Peride";
}
}
public class Peugeot206 implements IMotorCar {
public String getName() {
return "This is Peugeot206";
}
}
public class App {
public static void main(String[] args) {
IVehicleFactory factoryIranKhodro = new IranKhodro();
IDiesel diesel = factoryIranKhodro.getDiesel();
System.out.println(diesel.getName());
System.out.println(factoryIranKhodro.getMotorCar().getName());
IVehicleFactory factorySaipa = new Saipa();
System.out.println(factorySaipa.getDiesel().getName());
System.out.println(factorySaipa.getMotorCar().getName());
}
}
و نتیجه اجرای برنامه به شکل زیر خواهد شد.
This is Arena
This is Peugeot206
This is Foto
This is Peride
کلام آخر در مورد این الگو:- Abstract Factory یک interface یا کلاس abstract است که signature متدهای ساخت Objectها در آن تعریف شده است و Concrete Factoryها آنها را implement مینمایند.
- در Abstract Factory Pattern همه Productهای هم خانواده در Concrete Factory مربوط به آن خانواده پیاده سازی و مجتمع میگردند.
- در کدهای برنامه تنها با Abstract Factory و Abstract Productها سر و کار داریم و به هیچ وجه درگیر این مساله که کدام یک از Concrete Classها در برنامه مورد استفاده قرار میگیرند، نمیشویم.
مثال پیاده سازی شده با زبان جاوا را میتوانید از github من دانلود کنید.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.