بخش های اصلی

آموزش الگوهای طراحی

Design Pattern - الگوی Builder

الگوی Builder(سازنده)، اشیاء پیچیده را با استفاده از اشیاء ساده با روشی مرحله به مرحله، می سازه. این نوع از الگوی طراحی از آن جایی که یکی از بهترین راه های ایجاد اشیاء را ارائه میده، زیرگروه الگوی تکوینی محسوب میشه.

کلاس سازنده، شیء نهایی را بصورت مرحله به مرحله می سازه. این سازنده مستقل از اشیاء دیگه است.

پیاده سازی

در این بخش یک مورد کاری از یک رستورانِ fast-food را درنظر گرفته ایم که یک وعده ی غذایی معمولی آن می تواند یک برگر و یک نوشیدنیِ سرد باشه. برگر میتواند برگر سبزیجات یا برگرِ مرغ باشه و در پوششی بسته بندی شده باشه. نوشیدنیِ سرد هم ممکنه کُک یا پپسی و داخل بطری باشه.

این آیتم ها را ایجاد می کنیم: یک آیتمِ رابط که آیتم های غذا، مثل برگرها و نوشیدنی های سرد را ارائه میده و همچنین کلاس های concreteای که آیتم رابط را پیاده سازی می کنن و یک رابطِ Packing که بسته بندی آیتم های غذا را ارائه میده و کلاس های concreteای که رابط Packing را ارئه میکنن (چنانچه برگر ممکنه در یک پوشش بسته بندی بشه یا نوشیدنی سرد میتونه داخل بطری باشه).

سپس یک کلاسِ Meal که دارای یک لیستِ آرایه ای (ArrayList) از آیتم ها و یک MealBuilder برای ساخت انواع مختلف اشیاء Meal (غذا) همراه با ترکیب آیتم هاست، ایجاد می کنیم. BuilderPatternDemo، نسخه ی آزمایشیِ کلاسمان، از MealBuilder برای ساخت یک Meal استفاده میکنه.

builder pattern uml diagram

مرحله ی 1

ایجاد آیتمِ رابط که آیتم های غذا و بسته بندی آن ها را ارائه میده.

Item.java

public interface Item {
   public String name();
   public Packing packing();
   public float price();	
}

Packaging.java

public interface Packing {
   public String pack();
}

مرحله ی 2

ایجاد کلاس های concrete که رابط Packing را پیاده سازی می کنن.

Wrapper.java

public class Wrapper implements Packing {

   @Override
   public String pack() {
      return "Wrapper";
   }
}

Bottle.java

public class Bottle implements Packing {

   @Override
   public String pack() {
      return "Bottle";
   }
}

مرحله ی 3

ایجاد کلاس های انتزاعی (abstract) که آیتمِ رابط را که ویژگی های پیش فرض را ارائه میده، پیاده سازی می کنن.

Burger.java

public abstract class Burger implements Item {

   @Override
   public Packing packing() {
      return new Wrapper();
   }

   @Override
   public abstract float price();
}

ColdDrink.java

public abstract class ColdDrink implements Item {

	@Override
	public Packing packing() {
       return new Bottle();
	}

	@Override
	public abstract float price();
}

مرحله ی 4

ایجاد کلاس های concrete که کلاس های Burger و ColdDrink را توسعه میدن.

VegBurger.java

public class VegBurger extends Burger {

   @Override
   public float price() {
      return 25.0f;
   }

   @Override
   public String name() {
      return "Veg Burger";
   }
}

ChickenBurger.java

public class ChickenBurger extends Burger {

   @Override
   public float price() {
      return 50.5f;
   }

   @Override
   public String name() {
      return "Chicken Burger";
   }
}

Coke.java

public class Coke extends ColdDrink {

   @Override
   public float price() {
      return 30.0f;
   }

   @Override
   public String name() {
      return "Coke";
   }
}

Pepsi.java

public class Pepsi extends ColdDrink {

   @Override
   public float price() {
      return 35.0f;
   }

   @Override
   public String name() {
      return "Pepsi";
   }
}

مرحله ی 5

ایجاد کلاس Meal که حاویِ آیتم هایِ اشیاییِه که در بالا تعریف شدن.

Meal.java

import java.util.ArrayList;
import java.util.List;

public class Meal {
   private List items = new ArrayList();	

   public void addItem(Item item){
      items.add(item);
   }

   public float getCost(){
      float cost = 0.0f;
      
      for (Item item : items) {
         cost += item.price();
      }		
      return cost;
   }

   public void showItems(){
   
      for (Item item : items) {
         System.out.print("Item : " + item.name());
         System.out.print(", Packing : " + item.packing().pack());
         System.out.println(", Price : " + item.price());
      }		
   }	
}

مرحله ی 6

ایجاد کلاس MealBuilder.java، کلاس سازنده ی (builder) اصلی که مسئول ایجاد اشیاء Meal است.

MealBuilder.java

public class MealBuilder {

   public Meal prepareVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new VegBurger());
      meal.addItem(new Coke());
      return meal;
   }   

   public Meal prepareNonVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new ChickenBurger());
      meal.addItem(new Pepsi());
      return meal;
   }
}

مرحله ی 7

BuiderPatternDemo از MealBuilder برای نشان دادن الگوی سازنده (builder) استفاده می کنه.

BuilderPatternDemo.java

public class BuilderPatternDemo {
   public static void main(String[] args) {
   
      MealBuilder mealBuilder = new MealBuilder();

      Meal vegMeal = mealBuilder.prepareVegMeal();
      System.out.println("Veg Meal");
      vegMeal.showItems();
      System.out.println("Total Cost: " + vegMeal.getCost());

      Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
      System.out.println("\n\nNon-Veg Meal");
      nonVegMeal.showItems();
      System.out.println("Total Cost: " + nonVegMeal.getCost());
   }
}

مرحله ی 8

بررسی خروجی

Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : Coke, Packing : Bottle, Price : 30.0
Total Cost: 55.0


Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5
در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

شما چه نظر و یا سوالی درباره این نوشته دارید؟

مبحث آموزشی

آموزش الگوهای طراحی

Learn Design Patterns

سرفصل ها

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد