디자인 패턴 - Builder Pattern

Table of Contents

출처 : https://www.tutorialspoint.com/design_pattern/builder_pattern.htm

빌더 패턴은 간단한 객체를 사용하고 단계별 접근 방식을 사용하여 복잡한 객체를 빌드합니다. 이 패턴은 객체를 생성하는 가장 좋은 방법 중 하나를 제공하기 때문에 이러한 유형의 디자인 패턴은 생성 패턴에 속합니다.

Builder 클래스는 최종 개체를 단계별로 빌드합니다. 이 빌더는 다른 개체와 독립적입니다.

Implementation

우리는 전형적인 식사가 햄버거와 차가운 음료일 수 있는 패스트푸드 레스토랑의 비즈니스 사례를 고려했습니다. 버거는 채식 버거 또는 치킨 버거일 수 있으며 포장지로 포장됩니다. 차가운 음료는 콜라 또는 펩시일 수 있으며 병에 포장됩니다.

햄버거와 차가운 음료와 같은 음식 항목을 나타내는 Item 인터페이스와 Item 인터페이스를 구현하는 구체적인 클래스와 음식 항목의 포장을 나타내는 Packing 인터페이스를 만들고 햄버거가 래퍼와 차가운 음료에 포장되기 때문에 Packing 인터페이스를 구현하는 구체적인 클래스를 만들 것입니다. 병으로 포장될 것입니다.

그런 다음 ItemArrayListMealBuilder가 있는 Meal 클래스를 만들어 Item을 결합하여 다양한 유형의 Meal 개체를 만듭니다. BuilderPatternDemo, 데모 클래스는 MealBuilder를 사용하여 Meal을 빌드합니다.

Builder Pattern UML Diagram

Step 1

식품 항목 및 포장을 나타내는 인터페이스 항목을 작성하십시오.

Item.java

1public interface Item {
2   public String name();
3   public Packing packing();
4   public float price();
5}

Packing.java

1public interface Packing {
2   public String pack();
3}

Step 2

Packing 인터페이스를 구현하는 구체적인 클래스를 만듭니다.

Wrapper.java

1public class Wrapper implements Packing {
2
3   @Override
4   public String pack() {
5      return "Wrapper";
6   }
7}

Bottle.java

1public class Bottle implements Packing {
2
3   @Override
4   public String pack() {
5      return "Bottle";
6   }
7}

Step 3

기본 기능을 제공하는 항목 인터페이스를 구현하는 추상 클래스를 만듭니다.

Burger.java

 1public abstract class Burger implements Item {
 2
 3   @Override
 4   public Packing packing() {
 5      return new Wrapper();
 6   }
 7
 8   @Override
 9   public abstract float price();
10}

ColdDrink.java

 1public abstract class ColdDrink implements Item {
 2
 3@Override
 4public Packing packing() {
 5       return new Bottle();
 6}
 7
 8@Override
 9public abstract float price();
10}

Step 4

Burger 및 ColdDrink 클래스를 확장하는 구체적인 클래스 생성

VegBurger.java

 1public class VegBurger extends Burger {
 2
 3   @Override
 4   public float price() {
 5      return 25.0f;
 6   }
 7
 8   @Override
 9   public String name() {
10      return "Veg Burger";
11   }
12}

ChickenBurger.java

 1public class ChickenBurger extends Burger {
 2
 3   @Override
 4   public float price() {
 5      return 50.5f;
 6   }
 7
 8   @Override
 9   public String name() {
10      return "Chicken Burger";
11   }
12}

Coke.java

 1public class Coke extends ColdDrink {
 2
 3   @Override
 4   public float price() {
 5      return 30.0f;
 6   }
 7
 8   @Override
 9   public String name() {
10      return "Coke";
11   }
12}

Pepsi.java

 1public class Pepsi extends ColdDrink {
 2
 3   @Override
 4   public float price() {
 5      return 35.0f;
 6   }
 7
 8   @Override
 9   public String name() {
10      return "Pepsi";
11   }
12}

Step 5

위에서 정의한 Item 개체가 있는 Meal 클래스를 만듭니다.

Meal.java

 1import java.util.ArrayList;
 2import java.util.List;
 3
 4public class Meal {
 5   private List<Item> items = new ArrayList<Item>();
 6
 7   public void addItem(Item item){
 8      items.add(item);
 9   }
10
11   public float getCost(){
12      float cost = 0.0f;
13
14      for (Item item : items) {
15         cost += item.price();
16      }
17      return cost;
18   }
19
20   public void showItems(){
21
22      for (Item item : items) {
23         System.out.print("Item : " + item.name());
24         System.out.print(", Packing : " + item.packing().pack());
25         System.out.println(", Price : " + item.price());
26      }
27   }
28}

Step 6

Meal 객체 생성을 담당하는 실제 빌더 클래스인 MealBuilder 클래스를 생성합니다.

MealBuilder.java

 1public class MealBuilder {
 2
 3   public Meal prepareVegMeal (){
 4      Meal meal = new Meal();
 5      meal.addItem(new VegBurger());
 6      meal.addItem(new Coke());
 7      return meal;
 8   }
 9
10   public Meal prepareNonVegMeal (){
11      Meal meal = new Meal();
12      meal.addItem(new ChickenBurger());
13      meal.addItem(new Pepsi());
14      return meal;
15   }
16}

Step 7

BuiderPatternDemo는 MealBuider를 사용하여 빌더 패턴을 보여줍니다.

BuilderPatternDemo.java

 1public class BuilderPatternDemo {
 2   public static void main(String[] args) {
 3
 4      MealBuilder mealBuilder = new MealBuilder();
 5
 6      Meal vegMeal = mealBuilder.prepareVegMeal();
 7      System.out.println("Veg Meal");
 8      vegMeal.showItems();
 9      System.out.println("Total Cost: " + vegMeal.getCost());
10
11      Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
12      System.out.println("\n\nNon-Veg Meal");
13      nonVegMeal.showItems();
14      System.out.println("Total Cost: " + nonVegMeal.getCost());
15   }
16}

Step 8

출력을 확인합니다.

 1Veg Meal
 2Item : Veg Burger, Packing : Wrapper, Price : 25.0
 3Item : Coke, Packing : Bottle, Price : 30.0
 4Total Cost: 55.0
 5
 6
 7Non-Veg Meal
 8Item : Chicken Burger, Packing : Wrapper, Price : 50.5
 9Item : Pepsi, Packing : Bottle, Price : 35.0
10Total Cost: 85.5

이 시리즈의 게시물