Builder Pattern 기초 따라하기 [Lombok @Builder] [builder pattern 공부하기 - 2]
원문내용
https://www.tutorialspoint.com/design_pattern/builder_pattern.htm#
Design Patterns - Builder Pattern
Design Patterns Builder Pattern - Builder pattern builds a complex object using simple objects and using a step by step approach. This type of design pattern comes under creational pattern as this pattern provides one of the best ways to create an object.
www.tutorialspoint.com
빌드 패턴은 비교적 쉬운 객체와 단계적 접근접을 사용해서 복잡한 객체를 생성한다.
빌드 패턴은 객체를 생성하는 좋은 방법을 제공하므로 생성 패턴에 속한다.
"Builder" class는 최종 객체를 단계 별로 생성하는데, 이러한 빌드 객체는 다른 객체와 독립적이다.
구현 방법
패스트푸트 매장에서 특정한 식사가 햄버거도 음료도 될 수 있는 비즈니스 모델을 떠올려 보자.
또한 햄버거는 Veg Burger(고기가 들어가지 않은 버거) 치킨버거 가 될 수도 있고, 포장은 햄버거 전용 포장 용지에 포장 될 것이다.
그리고 차가운 음료는 코카콜라가 될 수도, 펩시가 될 수도 있다. 그리고 포장은 음료용기에 포장 될 것이다.
우리는 햄버거, 차가운 음료 등을 의미하는 Item 인터페이스를 만들고 Item에 대한 구체 클래스도 만들어 볼 것이고,
음식을 포장을 의미하는 Packing class와 Item의 타입에 따라 햄버거 전용 용지에 포장할지, 음료 전용 용기에 포장할지 정하는 구체 클래스도 만들어 볼 것이다.
Item의 ArrayList를 가지고 있는 Meal와 다른 다른 항목을 조합하여 다른 유형의 식사 객체를 만드는 MealBuilder를 생성한다.
BuilderPatternMain은 MealBuilder를 사용해서 Meal을 만들 것이다.
클래스 관계도
첫번째 단계
음식의 대한 Item을 나타내는 Item 인터페이스를 만든다.
public interface Item {
//이름 정하는 메서드
public String name();
//어떤 방식으로 패킹할지 정하는 메서드
public Packing packing();
//가격을 정하는 메서드
public float price();
}
어떤 방식으로 패킹 할지 정하는 Packing 인터페이스를 만든다.
public interface Packing {
//패킹하는 메서드
public String pack();
}
두번째 단계
Packing의 구체 클래스를 구현한다. 포장 방식은 햄버거 포장, 음료수용 포장에 넣는다.
public class Wrapper implements Packing {
@Override
public String pack() {
return "Wrapper";
}
}
public class Bottle implements Packing {
@Override
public String pack() {
return "Bottle";
}
}
세번째 단계
아이템의 기본 기능을 구현하는 추상 클래스를 만든다.
버거
public abstract class Burger implements Item {
//어떤 버거를 패킹하더라도 햄버거 래핑 방식이므로 구체적 메서드를 만든다.
@Override
public Packing packing() {
return new Wrapper();
}
//가격은 달라 질 수 있다.
@Override
public abstract float price();
}
음료
public abstract class ColdDrink implements Item {
@Override
public Packing packing() {
return new Bottle();
}
@Override
public abstract float price();
}
네번째 단계
아이템의 중간단계에 해당하는 버거와 음료에 대한 구체 클래스를 만든다.
public class VegBurger extends Burger {
@Override
public float price() {
return 25.0f;
}
@Override
public String name() {
return "Veg Burger";
}
}
public class ChickenBurger extends Burger {
@Override
public float price() {
return 50.5f;
}
@Override
public String name() {
return "Chicken Burger";
}
}
public class Coke extends ColdDrink {
@Override
public float price() {
return 30.0f;
}
@Override
public String name() {
return "Coke";
}
}
public class Pepsi extends ColdDrink {
@Override
public float price() {
return 35.0f;
}
@Override
public String name() {
return "Pepsi";
}
}
다섯번째 단계
위에서 만든 항목 객체가 있는 Meal class를 만든다.
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());
}
}
}
여섯번째 단계
Meal 객체 생성을 담당하는 Meal builder 클래스를 생성한다.
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;
}
}
일곱번째 단계
전체 빌더 패턴을 사용하는 Main 클래스
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());
}
}
열덜번째 단계
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
다음 포스트에서는 스프링 프로젝트로 옮겨 볼 것이다.