آشنایی با Builder Design Pattern در جاوا
در ادامه سری مقالات Design Pattern های جاوا به بررسی Builder Design Pattern میپردازیم.
مشکلات Factory Design Pattern
در مقاله قبل Abstract Design Pattern را در جاوا مورد بررسی قرار دادیم. با استفاده از این Design Pattern توانستیم با توجه به مشخصاتی که برای کلاس Factory ارسال میشود٬ کلاس های مورد نظر را ایجاد کنیم. اما این روش میتواند با مشکلاتی نیز مواجه شود. یکی از این مشکلات٬ ارسال چندین خاصیت برای کلاس مورد نظر است. زیرا ممکن است تعداد زیادی از متغیر ها به کلاس سازنده ارسال شود٬ در حالی که نوع آنها یکسان است٬ میتواند باعث این شود که نتوانیم ترتیب آنها را به درستی تشخیص دهیم و این امر میتواند باعث بروز خطا شود.
همچنین برخی از خواص ارسالی میتوانند اختیاری باشند این در حالی است که در کلاس Factory این خواص با استفاده از یک متد دریافت میشوند بنابراین تعداد متغیر ها ثابت و از پیش تعریف شده است. بنابراین باید برای مقادیر اختیاری٬ Null ارسال کنیم. همچنین اگر instance ایجاد شده٬ شامل پیچیدگی هایی باشد٬ این پیچیدگی ها در متد سازنده نیز دخیل میگردند و به طبع استفاده از متد Factory را نیز پیچیده میکنند. بنابراین Builder Design Pattern معرفی گردید تا این مشکلات ار مرتفع سازد.
پیاده سازی
برای پیاده سازی Builder Design Pattern نیاز است تا یک کلاس که Constructor آن متغیر های مورد نیاز را داراست٬ ایجاد کنیم و سپس باقی متغیر ها را با استفاده از setter ها به آن اضافه کنیم. این روش میتواند با یک مشکل مواجه شود و آن هم این است که ممکن است Object با شرایط و خواص مد نظر ایجاد نگردد. بنابراین باید یک متدی تعبیه شود تا با فراخوانی آن عملیات ایجاد Object به پایان رسد. بنابراین میتوان به این نتیجه رسید که با استفاده از Builder Design Pattern, میتوانیم عملیات instance سازی از روی کلاس را به صورت گام به گام انجام دهیم.
اکنون یک کلاس به نام Article ایجاد میکنیم و Builder Design Pattern را بر روی اعمال خواهیم کرد:
public class Article { // primary // getter and setter method private String title; private String author; private String category; // optional // getter and setter method private ArrayList<String> tags=new ArrayList<>(); private String secondCategory; }
همانطور که در تعریف کلاس مشاهده میکنید٬ سه متغیر title, author و category اصلی هستند و متغیر tags و second category اختیاری هستند.
اکنون یک کلاس static را به عنوان کلاس Builder ایجاد میکنیم و در درون همین کلاس قرار میدهیم و تمام متغیر ها را نیز در آن قرار میدهیم:
public class Article { ... public static class ArticleBuilder{ // primary // getter and setter method private String title; private String author; private String category; // optional // getter and setter method private ArrayList<String> tags=new ArrayList<>(); private String secondCategory; } }
اکنون constructor را برای متغیر های اصلی در کلاس builder آن ایجاد میکنیم:
public class Article { ... public static class ArticleBuilder{ ... public ArticleBuilder(String title, String author, String category) { this.title = title; this.author = author; this.category = category; } } }
سپس برای متد های اختیاری به این صورت در کلاس Builder مینویسیم:
public ArticleBuilder addTag(String tag) { tags.add(tag); return this; } public ArticleBuilder setSecondCategory(String category) { this.secondCategory = category; return this; }
در این دو متد٬ instance از کلاس Builder را برمیگردانیم که همان مقدار فعلی کلاس builder است. اکنون باید یک constructor به کلاس article اضافه کنیم که یک متغیر از نوع Article Builder دریافت میکند:
public Article(ArticleBuilder articleBuilder) { this.title = articleBuilder.title; this.author = articleBuilder.author; this.category = articleBuilder.category; this.tags = articleBuilder.tags; this.secondCategory = articleBuilder.secondCategory; }
و یک متد را برای ایجاد Object در کلاس Builder ایجاد میکنیم:
public Article build() { return new Article(this); }
اکنون برای استفاده از این کلاس میتوانیم به این صورت عمل کنیم:
Article articleBuilder = new Article.ArticleBuilder("Java Article", "Vhdrjb", "Java") .addTag("Java") .addTag("Design Pattern") .setSecondCategory("Android") .build(); System.out.println(articleBuilder.toString());
و خروجی آن به این صورت است:
Article info [ title :Java Article author : Vhdrjb category : Java secondary category : Android tags : [Java, Design Pattern]]
همانطور که مشاهده میکنید٬ متتغیر هایی که آن هارا اختیاری تعریف کردهایم٬ میتوانیم به صورت اختیاری مقدار دهی کنیم. برای مثال تعداد تگ ها میتوانند دلخواه و بسته به نوع مقاله تغییر کنند.
در این مقاله سعی بر این شد تا بتوانیم Builder Design Pattern را توضیح دهیم و شیوه استفاده از آن را بررسی کنیم.
با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.