Mẫu thiết kế - Mẫu xây dựng

Mẫu Builder xây dựng một đối tượng phức tạp bằng cách sử dụng các đối tượng đơn giản và sử dụng phương pháp tiếp cận từng bước. Loại mẫu thiết kế này thuộc mẫu sáng tạo vì mẫu này cung cấp một trong những cách tốt nhất để tạo một đối tượng.

Một lớp Builder xây dựng đối tượng cuối cùng theo từng bước. Trình xây dựng này độc lập với các đối tượng khác.

Thực hiện

Chúng tôi đã xem xét một trường hợp kinh doanh của nhà hàng thức ăn nhanh, nơi một bữa ăn điển hình có thể là bánh mì kẹp thịt và đồ uống lạnh. Burger có thể là Veg Burger hoặc Chicken Burger và sẽ được đóng gói bằng giấy gói. Đồ uống lạnh có thể là coca hoặc pepsi và sẽ được đóng trong chai.

Chúng tôi sẽ tạo một giao diện Item đại diện cho các mặt hàng thực phẩm như bánh mì kẹp thịt và đồ uống lạnh và các lớp cụ thể triển khai giao diện Item và một giao diện Đóng gói đại diện cho việc đóng gói các mặt hàng thực phẩm và các lớp cụ thể triển khai giao diện Đóng gói như burger sẽ được đóng gói trong giấy gói và đồ uống lạnh sẽ được đóng gói dưới dạng chai.

Sau đó, chúng tôi tạo một lớp Bữa ănArrayList of ItemMealBuilder để xây dựng các loại đối tượng Bữa ăn khác nhau bằng cách kết hợp Item . BuilderPatternDemo , lớp demo của chúng ta sẽ sử dụng MealBuilder để xây dựng Bữa ăn .

Bước 1

Tạo giao diện Mục đại diện cho mặt hàng thực phẩm và đóng gói.

Item.java

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

Packing.java

public interface Packing {
   public String pack();
}

Bước 2

Tạo các lớp cụ thể thực hiện giao diện Đóng gói.

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";
   }
}

Bước 3

Tạo các lớp trừu tượng triển khai giao diện mục cung cấp các chức năng mặc định.

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();
}

Bước 4

Tạo các lớp cụ thể mở rộng các lớp Burger và 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";
   }
}

Bước 5

Tạo một lớp Bữa ăn có các đối tượng Item được định nghĩa ở trên.

Meal.java

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

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

   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());
      }		
   }	
}

Bước 6

Tạo một lớp MealBuilder, lớp người xây dựng thực tế chịu trách nhiệm tạo các đối tượng Bữa ăn.

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;
   }
}

Bước 7

BuiderPatternDemo sử dụng MealBuider để chứng minh mẫu trình tạo.

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());
   }
}

Bước 8

Xác minh kết quả đầu ra.

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