빌더 패턴


빌더 패턴은 여러 개의 간단한 개체를 사용하여 복잡한 개체를 단계별로 만듭니다. 이러한 유형의 디자인 패턴은 객체를 생성하는 최적의 방법을 제공하는 생성 패턴입니다.

Builder 클래스는 최종 객체를 단계별로 구성합니다. Builder 클래스는 다른 객체와 독립적입니다.

Introduction

의도: 복잡한 구성을 표현에서 분리하여 동일한 구성 프로세스가 다른 표현을 만들 수 있도록 합니다.

주요 솔루션: 주요 솔루션: 소프트웨어 시스템에서는 때때로 요구 사항 변경으로 인해 특정 알고리즘을 사용하여 각 부분의 하위 개체로 구성된 "복잡한 개체"가 생성되는 상황에 직면합니다. 이 복잡한 객체의 복잡성 개별 부품은 종종 급격한 변화에 직면하지만 이를 하나로 묶는 알고리즘은 비교적 안정적입니다.

사용 시기: 일부 기본 구성 요소는 변경되지 않지만 그 조합이 자주 변경되는 경우.

해결 방법: 불변성과 별도의 변경입니다.

키 코드: Builder: 인스턴스 생성 및 제공, Director: 빌드된 인스턴스의 종속성을 관리합니다.

적용 사례: 1. KFC에 가면 버거, 콜라, 감자튀김, 닭날개 튀김 등은 똑같지만 그 조합이 자주 바뀌면서 이른바 '정식'이 탄생한다. 2. JAVA의 StringBuilder.

장점: 1. 빌더가 독립적이고 확장이 쉽습니다. 2. 세부적인 리스크를 쉽게 통제할 수 있습니다.

단점: 1. 제품에는 공통점이 있어야 하며 범위가 제한적입니다. 2. 내부 변경사항이 복잡할 경우, 구축 클래스가 많아집니다.

사용 시나리오: 1. 생성해야 하는 개체는 내부 구조가 복잡합니다. 2. 생성해야 하는 객체의 내부 속성은 상호 의존적입니다.

참고: 공장 모드와 다른 점은 빌더 모드는 부품 조립 순서에 더 주의를 기울인다는 것입니다.

Implementation

우리는 전형적인 정식이 버거(Burger)와 차가운 음료(Cold Drink)일 수 있는 패스트푸드 레스토랑의 비즈니스 사례를 가정합니다. 버거는 채식 버거 또는 치킨 버거가 될 수 있으며 상자에 포장됩니다. 차가운 음료는 콜라나 펩시가 될 수 있으며 병에 담겨 나옵니다.

우리는 Item 인터페이스를 구현하는 Item 인터페이스 및 엔터티 클래스를 생성하여 음식 항목(예: 버거 및 차가운 음료)을 나타내고, Packing 인터페이스 및 Packing 인터페이스를 구현하는 엔터티 클래스를 생성합니다. 식품 포장을 의미하며, 버거는 상자에, 차가운 음료는 병에 담겨 나옵니다.

그런 다음 ItemArrayListItem을 결합하여 다양한 유형의 Meal 개체를 만드는 MealBuilder를 사용하여 Meal 클래스를 만듭니다. BuilderPatternDemo, 우리의 데모 클래스는 MealBuilder를 사용하여 Meal을 만듭니다.

builder_pattern_uml_diagram.jpg

1단계

식품과 식품 포장을 나타내는 인터페이스를 만듭니다.

Item.java

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

Packing.java

public interface Packing {
   public String pack();
}

2단계

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단계

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

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단계

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단계

위에서 정의한 Item 개체를 사용하여 Meal 클래스를 만듭니다.

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

6단계

MealBuilder 클래스를 생성합니다. 실제 빌더 클래스는 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 MealBuider를 사용하여 빌더 패턴을 시연합니다.

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단계

출력을 확인합니다.

rreee