빌더 패턴
빌더 패턴은 여러 개의 간단한 개체를 사용하여 복잡한 개체를 단계별로 만듭니다. 이러한 유형의 디자인 패턴은 객체를 생성하는 최적의 방법을 제공하는 생성 패턴입니다.
Builder 클래스는 최종 객체를 단계별로 구성합니다. Builder 클래스는 다른 객체와 독립적입니다.
Introduction
의도: 복잡한 구성을 표현에서 분리하여 동일한 구성 프로세스가 다른 표현을 만들 수 있도록 합니다.
주요 솔루션: 주요 솔루션: 소프트웨어 시스템에서는 때때로 요구 사항 변경으로 인해 특정 알고리즘을 사용하여 각 부분의 하위 개체로 구성된 "복잡한 개체"가 생성되는 상황에 직면합니다. 이 복잡한 객체의 복잡성 개별 부품은 종종 급격한 변화에 직면하지만 이를 하나로 묶는 알고리즘은 비교적 안정적입니다.
사용 시기: 일부 기본 구성 요소는 변경되지 않지만 그 조합이 자주 변경되는 경우.
해결 방법: 불변성과 별도의 변경입니다.
키 코드: Builder: 인스턴스 생성 및 제공, Director: 빌드된 인스턴스의 종속성을 관리합니다.
적용 사례: 1. KFC에 가면 버거, 콜라, 감자튀김, 닭날개 튀김 등은 똑같지만 그 조합이 자주 바뀌면서 이른바 '정식'이 탄생한다. 2. JAVA의 StringBuilder.
장점: 1. 빌더가 독립적이고 확장이 쉽습니다. 2. 세부적인 리스크를 쉽게 통제할 수 있습니다.
단점: 1. 제품에는 공통점이 있어야 하며 범위가 제한적입니다. 2. 내부 변경사항이 복잡할 경우, 구축 클래스가 많아집니다.
사용 시나리오: 1. 생성해야 하는 개체는 내부 구조가 복잡합니다. 2. 생성해야 하는 객체의 내부 속성은 상호 의존적입니다.
참고: 공장 모드와 다른 점은 빌더 모드는 부품 조립 순서에 더 주의를 기울인다는 것입니다.
Implementation
우리는 전형적인 정식이 버거(Burger)와 차가운 음료(Cold Drink)일 수 있는 패스트푸드 레스토랑의 비즈니스 사례를 가정합니다. 버거는 채식 버거 또는 치킨 버거가 될 수 있으며 상자에 포장됩니다. 차가운 음료는 콜라나 펩시가 될 수 있으며 병에 담겨 나옵니다.
우리는 Item 인터페이스를 구현하는 Item 인터페이스 및 엔터티 클래스를 생성하여 음식 항목(예: 버거 및 차가운 음료)을 나타내고, Packing 인터페이스 및 Packing 인터페이스를 구현하는 엔터티 클래스를 생성합니다. 식품 포장을 의미하며, 버거는 상자에, 차가운 음료는 병에 담겨 나옵니다.
그런 다음 Item의 ArrayList과 Item을 결합하여 다양한 유형의 Meal 개체를 만드는 MealBuilder를 사용하여 Meal 클래스를 만듭니다. BuilderPatternDemo, 우리의 데모 클래스는 MealBuilder를 사용하여 Meal을 만듭니다.
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