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












