728x90

builder의 사전적 의미는 '건축물을 짓는 사람 또는 회사'이다. 즉 커다란 구조의 큰 물체를 설계하고 만드는 것을 의미한다.

 

빌더 패턴

: 복잡한 구조를 가진 복합 객체의 생성 과정을 분리하여 처리하는 패턴

→ 추상 팩토리를 확장하여 크고 복잡한 객체를 생성할 수 있다.

→ 복합 객체의 생성 과정을 단계별로 분리함으로써 복합 객체의 생성을 일반화할 수 있다.

→ 복합 객체 생성 과정을 독립된 클래스로 관리한다.

 

기본 구조

빌더 패턴은 생성자에 들어갈 매개 변수가 많든 적든 차례차례 매개 변수를 받아들이고 모든 매개 변수를 받은 뒤에 이 변수들을 통합해서 한번에 사용한다.

ex1) UML 클래스 다이어그램

# 장점
  - 복합 객체를 생성할 수 있어, 동적으로 객체를 확장할 수 있어 효율적이다.

# 단점
  - 코드가 장황해지기 때문에 성능에 민감한 상황에 문제가 될 수 있다.
  - 

 

빌더 패턴 팩토리 패턴과의 차이점

- 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

+ Recent posts