آشنایی با Factory Design Pattern جاوا
در ادامه سری مقالات Design Pattern در جاوا، قصد داریم تا Factory Design Pattern را مورد بررسی قرار دهیم. این Design Pattern در JDK نیز مورد استفاده قرار گرفته است. برای مثال Calendar, Resource Budler و Number Format از این Design Pattern استفاده میکنند. اما در گام اول باید بررسی کنیم که هدف این Design Pattern چیست و در چه مواقعی باید استفاده کرد.
وقتی از Factory Design Pattern استفاده میکنیم که چندین کلاس از یک کلاس و یا interface مشتق شده باشند. که این عمل میتواند با implement شدن و یا ارث بری از کلاس اصلی انجام شود. سپس از یک کلاس استفاده میشود تا متناسب با مقدار و یا مقادیر ورودی، نوع کلاسی که باید ایجاد شود را مشخص کند. در این Design Pattern یک instance بدون توجه به logic کلاس ساخته میشود.
پیاده سازی
پیاده سازی Factory را میتوانیم با یک مثال ساده انجام دهیم. فرض کنید سه دسته کارمند در یک شرکت وجود دارند و میخواهیم با استفاده از کد پرسنلیشان اطلاعات آنها را مشخص کنیم. به صورت پیش فرض، سه حرف برای مشخص شدن دستهی هر کارمند در ابتدای کد پرسنلیاش قرار میگیرد. کارمندان بخش پشتیبانی با سه حرف SUP، کارمندان بخش فنی با سه حرف TEC و کارمندان بخش فروش با سه حرف SAL از یکدیگر متمایز میشوند. حال میخواهیم با استفاده از این Design pattern، اطلاعات کارمندان را دریافت کنیم.
در ابتدا نیاز است تا یک کلاس abstract ایجاد کنیم. البته کلاس اصلی ما میتواند یک کلاس معمولی، یک کلاس abstract و یا یک interface باشد.
public abstract class Staff { // getter and setter private String name; private String code; }
برای هریک از سه کلاس زیر مجموعه، دو field متفاوت در نظر میگیریم. برای بخش پشتیبانی جنسیت و موضوع پشتیبانی را در نظر میگیریم:
public class Support extends Staff{ // getter and setter private String gender; private String subject; }
برای بخش فنی، حوزه و مدرک کارمند را مشخص میکنیم:
public class Technical extends Staff { // getter and setter private String subject; private String licence; }
و برای بخش فروش٬ جنسیت و شهری که در آن مشغول است را مشخص میکنیم:
public class Sale extends Staff{ // getter and setter private String gender; private String city; }
به این ترتیب مدل های دادهای ما مشخص شده اند و اکنون باید متناسب با کد پرنسلی٬ اطلاعات کارمند را دریافت کنیم. برای این منظور کلاس Factory را چنین مینویسیم:
public class StaffFactory { private final static String SUPPORT = "SUP"; private final static String TECHNICAL = "TEC"; private final static String SALE = "SAL"; public static Staff getStaff(String code) { Database database = new Database(); if (code.startsWith(SUPPORT)) { return database.getSupport(code); } else if (code.startsWith(TECHNICAL)) { return database.getTehcnical(code); } else if (code.startsWith(SALE)) { return database.getSale(code); } return null; } }
همانظور که در کد مشخص است٬ بر اساس شروع کد پرسنلی٬ اطلاعات کارمند را پیدا میکند و به این صورت میتوانیم از آن استفاده کنیم:
Staff saleWoman = StaffFactory.getStaff("SAL-2321"); Staff technicalSupport = StaffFactory.getStaff("SUP-2349"); Staff sysAdmin = StaffFactory.getStaff("TEC-7984"); System.out.println(saleWoman instanceof Sale); // true System.out.println(technicalSupport instanceof Support); // true System.out.println(sysAdmin instanceof Technical); // true
اکنون میتوانیم متد toString را برای هریک از کلاس ها پیاده سازی کنیم و تفاوت نتیجه ها را دریابیم. برای Technical :
@Override public String toString() { return "Technical : " + subject + " with :" + licence; }
برای Support :
@Override public String toString() { return "Support " + gender + " - in : " + subject; }
و برای Sale :
@Override public String toString() { return "Sale :" + gender + " - at :" + city; }
به این صورت متد toString را Override میکنیم و خروجی به این صورت تغییر میکند:
Sale :female - at :babol Support male - in : technical Technical : system admin with :redhat
میتوانیم از Singleton ها نیز در Factory Design Pattern استفاده کنیم. به این ترتیب میتوانیم با استفاده از یک Factory ایجاد کلاس ها را مدیریت کنیم.
با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.