728x90
builder의 사전적 의미는 '건축물을 짓는 사람 또는 회사'이다. 즉 커다란 구조의 큰 물체를 설계하고 만드는 것을 의미한다.
빌더 패턴
: 복잡한 구조를 가진 복합 객체의 생성 과정을 분리하여 처리하는 패턴
→ 추상 팩토리를 확장하여 크고 복잡한 객체를 생성할 수 있다.
→ 복합 객체의 생성 과정을 단계별로 분리함으로써 복합 객체의 생성을 일반화할 수 있다.
→ 복합 객체 생성 과정을 독립된 클래스로 관리한다.
기본 구조
빌더 패턴은 생성자에 들어갈 매개 변수가 많든 적든 차례차례 매개 변수를 받아들이고 모든 매개 변수를 받은 뒤에 이 변수들을 통합해서 한번에 사용한다.
# 장점
- 복합 객체를 생성할 수 있어, 동적으로 객체를 확장할 수 있어 효율적이다.
# 단점
- 코드가 장황해지기 때문에 성능에 민감한 상황에 문제가 될 수 있다.
-
빌더 패턴과 팩토리 패턴과의 차이점
- Builder 는 복합 객체를 사용한다.
- Factory 는 단일 객체를 사용한다.
-
Builder Pattern example diagram
Builder Pattern example 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 Cook {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pizzaBuilder) {
this.pizzaBuilder = pizzaBuilder;
}
public Pizza getPizza() {
return pizzaBuilder.getPizza();
}
public void constructPizza() {
pizzaBuilder.createNewPizzaProduct();
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildTopping();
}
}
/** A given type of pizza being constructed. */
public class BuilderExample {
public static void main(String[] args) {
Cook cook = new Cook();
PizzaBuilder hawaiianPizzaBuilder = new HawaiianPizzaBuilder();
PizzaBuilder spicyPizzaBuilder = new SpicyPizzaBuilder();
cook.setPizzaBuilder(hawaiianPizzaBuilder);
cook.constructPizza();
Pizza pizza = cook.getPizza();
}
}
# 참고 사이트
- https://readystory.tistory.com/121
- https://ko.wikipedia.org/wiki/%EB%B9%8C%EB%8D%94_%ED%8C%A8%ED%84%B4
- https://ansohxxn.github.io/design%20pattern/chapter10/
- https://devfunny.tistory.com/337
-
-
728x90
'IT > Design Pattern' 카테고리의 다른 글
[디자인패턴] 프록시(Proxy) (0) | 2022.06.18 |
---|---|
[디자인 패턴] 기본 개념 (0) | 2021.10.04 |
[디자인 패턴] 추상 팩토리(Abstract Factory) (0) | 2021.09.27 |