در این قسمت تیم کدگیت را با آموزش Builder پترن در جاوا همراهی کنید. پیش نیاز این آموزش شامل موارد زیر است:
- Interface در جاوا
- Abstract در جاوا
- آشنایی با متد
- آشنایی با Arraylist
- آشنایی با For
- آشنایی با شی گرایی
Creational Design Pattern
یکی از زیر شاخه های دیزاین پترن Creational Design Pattern هست. این پترن راهی برای ساخت اشیاست. وقتی از این الگو استفاده میشود که ما میخواهیم در برنامه خود از یک کلاس یک شی را بسازیم. اما برای بسیاری ممکن است ساخت شی بسیار ساده باشد و فقط با new کردن ما یک شی را بسازیم. اما hard code راه حل خوبی نیست!! زیرا ما بعضی اوقات در کد خود هویت یک کلاس را عوض کنیم و در این گونه اوقات ما باید از Creational Design pattern استفاده میکنیم.
Builder پترن در جاوا
Builder پترن در جاوا یکی از شاخههای creational design pattern است. همانطور که از اسم آن نیز پیداست برای ساخت اشیا از این پترن استفاده میشود. هدف Builder پترن در جاوا ساخت اشیا پیچیده با استفاده از اشیا ساده است.
هر چه نرمافزار پیچیدهتر باشد پیچیدگی کلاسها و اشیا آن بیشتر میشود. در هنگاه ساخت اشیا پیچیده باید توجه و دقت ویژهای داشت. نرمافزار ممکن است نیاز به مکانیزمی برای ساخت اشیا پیچیدهای داشته باشد که هنگام ساخت، شی وابسته به کلاس سازنده نباشد!! اگر شما با چنین مشکلی در برنامه خود روبرو هستید نیاز به استفاده از Builder پترن دارید.
مثال Builder پترن در جاوا
برای درک بهتر این پترن یک مثال میزنیم! مثال ما شامل مراحل زیر است:
- یک interface به نام packing میسازیم.
- 2 کلاس abstract به نام company و cd میسازیم.
- دو کلاس Concrete به نام Sony و Samsung میسازیم.
- کلاس CDType را میسازیم.
- کلاس Cdbuilder را میسازیم.
- تست برنامه را مینویسیم.
کد کلاسها و interface های توضیح داده شده به صورت زیر است:
public interface Packing {
public String pack();
public int price();
}
public abstract class CD implements Packing {
public abstract String pack();
}
public abstract class Company extends CD {
public abstract int price();
}
public class Sony extends Company {
@Override
public int price() {
return 20;
}
@Override
public String pack() {
return "Sony CD";
}
}
public class Samsung extends Company {
@Override
public int price() {
return 15;
}
@Override
public String pack() {
return "Samsung CD";
}
}
public class CDType {
private List<Packing> items = new ArrayList<Packing>();
public void addItem(Packing packs) {
items.add(packs);
}
public void getCost() {
for (Packing packs : items) {
packs.price();
}
}
public void showItems() {
for (Packing packing : items) {
System.out.print("CD name : " + packing.pack());
System.out.println(", Price : " + packing.price());
}
}
}
public class CDBuilder {
public CDType buildSonyCD() {
CDType cds = new CDType();
cds.addItem(new Sony());
return cds;
}
public CDType buildSamsungCD() {
CDType cds = new CDType();
cds.addItem(new Samsung());
return cds;
}
}
public static void main(String[] args) {
CDBuilder cdBuilder = new CDBuilder();
CDType cdType1 = cdBuilder.buildSonyCD();
cdType1.showItems();
CDType cdType2 = cdBuilder.buildSamsungCD();
cdType2.showItems();
}

توضیح دیاگرام Builder پترن
اگر به دیاگرام کد بالا توجه کنید. اولین نکتهای که متوجه میشوید تعداد زیاد کلاس است برای مسئلهای ساده!! همانطور که گفته شد Builder دیزاین پترن برای مسائل با تعداد اشیا بالا است. یک نکته ای که توجه ما را جلب میکند نبودن interface در سطح پایین است فقط یک interface آن هم در لایههای بالایی. برای استفاده از این پترن حتما به این نکات توجه کنید!!
با عرض سلام و خسته نباشید
فک می کنم الگوی بیلدر رو اشتباه نوشتین
https://www.baeldung.com/creational-design-patterns
سلام. بیلدر پترن در لینکی که ارائه دادید تقریبا شبیه به گفته های این آموزش بود البته مثالی متفاوت نسبت به این آموزش زده بود…
در کل هر دو یک مطلب بیان کرده اند.
تشکر از توجه شما