1. Builder Pattern ¶
1.2. 되는 ¶
()드 랑 맥날드 린 밀 만들내는 로 를 들 다. 반로 밀 메, 드, 료, 난감 (, 라, 라, 매달 바뀌는 난감)로 루 다. 기 , 런 릿 다는 것다. 같 까다로 들게 릴때부 맥날드 들놓려면 당 다 바리 다. 고객 나 나, 면 맥겟나 런 만, 기본로 밀 구되는 방는 변 다. 기 빌더 다면, 문 는 Director 라고 다. 물론 고객 Customer 다. 고객 는 바리 밀 를 구게 되면 (Customer가 Concrete Builder 를 다) Director 는 릿 따라 방 (Concrete Builder) 게 뢰 밀 (Product) 를 만들 낸다. 기 Director 가 Concrete Builder 게 구는 방 류 따라 므로 그것 를 Builder 라고 겠다.
1.3.2. Concrete Builder ¶
Builder 를 구 부. 반로 다개 Concrete Builder 가 며, Builder 가 공는 를 late binding 로 게 된다. 물론, builder pattern 관는 Product 를 만들내는 것다.
1.4.1. Wikipedia Java code ¶
/** "Product" */ class Pizza { private String dough = ""; private String sauce = ""; private String topping = ""; public void setDough (String dough) { this.dough = dough; } public void setSauce (String sauce) { this.sauce = sauce; } public void setTopping (String topping) { this.topping = topping; } } /** "Abstract Builder" */ abstract class PizzaBuilder { protected Pizza pizza; public Pizza getPizza() { return pizza; } public void createNewPizzaProduct() { pizza = new Pizza(); } public abstract void buildDough(); public abstract void buildSauce(); public abstract void buildTopping(); } /** "ConcreteBuilder" */ class HawaiianPizzaBuilder extends PizzaBuilder { public void buildDough() { pizza.setDough("cross"); } public void buildSauce() { pizza.setSauce("mild"); } public void buildTopping() { pizza.setTopping("ham+pineapple"); } } /** "ConcreteBuilder" */ class SpicyPizzaBuilder extends PizzaBuilder { public void buildDough() { pizza.setDough("pan baked"); } public void buildSauce() { pizza.setSauce("hot"); } public void buildTopping() { pizza.setTopping("pepperoni+salami"); } } /** "Director" */ class Waiter { private PizzaBuilder pizzaBuilder; public void setPizzaBuilder (PizzaBuilder pb) { pizzaBuilder = pb; } public Pizza getPizza() { return pizzaBuilder.getPizza(); } public void constructPizza() { pizzaBuilder.createNewPizzaProduct(); pizzaBuilder.buildDough(); pizzaBuilder.buildSauce(); pizzaBuilder.buildTopping(); } } /** A customer ordering a pizza. */ class BuilderExample { public static void main(String[] args) { Waiter waiter = new Waiter(); PizzaBuilder hawaiianPizzaBuilder = new HawaiianPizzaBuilder(); PizzaBuilder spicyPizzaBuilder = new SpicyPizzaBuilder(); waiter.setPizzaBuilder ( hawaiianPizzaBuilder ); waiter.constructPizza(); Pizza pizza = waiter.getPizza(); } }
1.4.2.1. nijel.product ¶
// PlanComponent package nijel.product; public class PlanComponent { protected String name; protected String description; public PlanComponent(String name, String description) { this.name = name; this.description = description; } public void add(PlanComponent planComponent) { throw new UnsupportedOperationException(); } public void remove(PlanComponent planComponent) { throw new UnsupportedOperationException(); } public PlanComponent getChild(int index) { throw new UnsupportedOperationException(); } public String getName() { throw new UnsupportedOperationException(); } public String getDescription() { throw new UnsupportedOperationException(); } public void print() { throw new UnsupportedOperationException(); } } // Plan package nijel.product; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Plan extends PlanComponent { private List<PlanComponent> planComponents; public String getName() { return name; } public String getDescription() { return description; } public Plan(String name, String description) { super(name, description); planComponents = new ArrayList<PlanComponent>(); } public void add(PlanComponent planComponent) { planComponents.add(planComponent); } public PlanComponent getChild(int index) { return planComponents.get(index); } public void remove(PlanComponent planComponent) { planComponents.remove(planComponent); } public void print() { System.out.println("\n" + getName()); System.out.println(", " + getDescription()); System.out.println("------------------------------"); Iterator iterator = planComponents.iterator(); while (iterator.hasNext()) { PlanComponent planComponent = (PlanComponent) iterator.next(); planComponent.print(); } } } // PlanItem package nijel.product; public class PlanItem extends PlanComponent { public PlanItem(String name, String description) { super(name, description); } public String getName() { return name; } public String getDescription() { return description; } public void print() { System.out.println("\t" + getName() + "\n"); System.out.println("\t\t" + getDescription() + "\n"); } }
1.4.2.2. nijel.builder ¶
// director package nijel.builder; import nijel.product.PlanComponent; public abstract class Planner { abstract public PlanComponent makePlan(); } // concrete director package nijel.builder; import nijel.product.PlanComponent; public class MyPlanner extends Planner { private Builder builder; public MyPlanner(Builder builder) { this.builder = builder; } public PlanComponent makePlan() { int first, second, third; first = 1; builder.buildDay(first); builder.addHotel(first, "Patternsland 5 star Hotel"); builder.addTickets(first, "Park Ticket: R"); builder.addReservation(first, "Dinner at VERY expensive French restaurant"); second = 2; builder.buildDay(second); builder.addHotel(second, "Maybe Hotel"); builder.addTickets(second, "Park Ticket: A"); builder.addSpecialEvent(second, "Patterns on Ice"); builder.addReservation(second, "just dinner"); third = 3; builder.buildDay(third); builder.addHotel(third, "Wannabe Hotel"); builder.addTickets(third, "Ticket for Children!"); return builder.getVacationPlan(); } } // builder package nijel.builder; import nijel.product.PlanComponent; public interface Builder { abstract public void buildDay(int date); abstract public void addHotel(int date, String hotel); abstract public void addTickets(int date, String ticket); abstract public void addSpecialEvent(int date, String event); abstract public void addReservation(int date, String restaurant); abstract public PlanComponent getVacationPlan(); } // concrete builder package nijel.builder; import nijel.product.Plan; import nijel.product.PlanComponent; import nijel.product.PlanItem; public class VacationBuilder implements Builder { private PlanComponent plan; public VacationBuilder(String description) { plan = new Plan(description); } public void addHotel(int date, String hotel) { PlanComponent hotelReservation = new PlanItem(hotel); plan.getChild(date - 1).add(hotelReservation); } public void addSpecialEvent(int date, String event) { PlanComponent specialEvent = new Plan("Special Event"); specialEvent.add(new PlanItem(event)); plan.getChild(date - 1).add(specialEvent); } public void addTickets(int date, String ticket) { PlanComponent admissionTicket = new PlanItem(ticket); plan.getChild(date - 1).add(admissionTicket); } public void buildDay(int date) { plan.add(new Plan(date + "day's plan")); } public PlanComponent getVacationPlan() { return plan; } public void addReservation(int date, String restaurant) { PlanComponent reservation = new Plan("Dining"); reservation.add(new PlanItem(restaurant)); plan.getChild(date - 1).add(reservation); } }
1.4.2.3. nijel.client ¶
package nijel.client; import nijel.builder.*; import nijel.product.*; public class Client { public static void main(String[] args) { PlanComponent perfectVacationPlan; Planner perfectPlanner = new MyPlanner(new VacationBuilder("Perfect Vacation Plan")); perfectVacationPlan = perfectPlanner.makePlan(); perfectVacationPlan.print(); } }
1.5. Builder Pattern 과 Abstract Factory Pattern ¶
보다 Builder Pattern 과 Abstract Factory Pattern 많 다. 라면 미묘다고 는데, Abstract Factory Pattern 무 만들는가 맞고 고, Builder Pattern 떻게 만들 는가 맞고 다고 다. 물론 두 류 Creational Pattern Product 공는데 다. 가 라면, Builder Pattern 복 브를 단 단 만들 단 리고, Abstract Factory Pattern 러 류 generic product 를 러류 concrete factory 가 기 때문 각각 브가 만들 때다 product 를 게 된다.
Abstract Factory Pattern : 떤 류 명 브를 것를 까 기다. ( 결다) 를 들면, 랑 늘 메뉴를 는 것다. (interface to factory)는 "늘 리" 라는 abstract generic message 를 방(concrete factory) 달고 게 될 때 concrete product 를 게 되는 것다.
Builder Pattern : 복 브를 떤 방로 만들낼 대 방법 공다. (encapsulate) 를 들면, 때, (builder) 게 면(product 곽)를 공면 는 련 (complex object) 만들 낸다.
데 .
문 http://en.wikipedia.org/wiki/Builder_pattern
문 http://en.wikipedia.org/wiki/Builder_pattern