-
[Design Pattern] Builder PatternLearn/Architecture 2022. 8. 30. 21:18
# 개요
- 쉽게 알고리즘을 교체할 수 있는 객체를 생성하기 위한 패턴
- director와 (concrete)builder가 중요
- director: 최종 제품이 되기 위해 어떤 파트가 필요한지를 알고 있음
- (concrete) builder: 각 파트들을 어떻게 만들어야 할지를 알고 있음
- 아래 그림처럼 builder 인터페이스를 통해 builder를 쉽게 바꿀 수 있음
- 전략패턴의 구조와 유사
- 아래 그림처럼 director가 builder에게 각 파트 생성을 요청한다.
- 중요한건 클라이언트는 각 파트가 어떻게 구성되었는지 관심이 없다는 점이다.
- 다 조립된 제품에만 관심있다.
# Participants
Client
- director와 concrete builder를 선택
- director에게 어떤 concrete builder와 일할지를 알려줌
- concrete builder에게 최종 product를 요청
Director
- 최종 제품을 위한 스텝을 알고 있음
- 각 스텝의 디테일은 모름
Builder
- concrete builder의 공통된 인터페이스를 제공
Concrete Builder
- 각 스텝의 디테일을 알고 있음
Product
- 여러 파트의 조합으로 만들어지는 complex object
# 예시
director
- 같이 일할 concrete builder를 생성
- constructAirplane 부분과 같이 최종적인 제품을 만들기 위한 스텝을 알고 있다.
public class AerospaceEngineer { private AirplaneBuilder airplaneBuilder; public void setAirplaneBuilder(AirplaneBuilder ab) { airplaneBuilder = ab; } public Airplane getAirplane() { return airplaneBuilder.getAirplane(); } public void constructAirplane() { airplaneBuilder.createNewAirplane(); airplaneBuilder.buildWings(); airplaneBuilder.buildPowerplant(); airplaneBuilder.buildAvionics(); airplaneBuilder.buildSeats(); } }
Abstract Builder
- 각각의 파트를 위한 abstract method를 제공
- 최종 제품인 airplane을 만들기 위한 함수를 호출
public abstract class AirplaneBuilder { protected Airplane airplane; protected String customer; protected String type; public Airplane getAirplane() { return airplane; } public void createNewAirplane() { airplane = new Airplane(customer, type); } public abstract void buildWings(); public abstract void buildPowerplant(); public abstract void buildAvionics(); public abstract void buildSeats(); }
Concrete Builder
- Abstract builder에서 제공하는 abstract method를 구현
public class CropDuster extends AirplaneBuilder { CropDuster (String customer){ super.customer = customer; super.type = "Crop Duster v3.4"; } public void buildWings() { airplane.setWingspan(9f); } public void buildPowerplant() { airplane.setPowerplant("single piston"); } public void buildAvionics() {} public void buildSeats() { airplane.setNumberSeats(1,1); } }
# 유의사항
인터페이스가 자주 바뀐다면 이 패턴을 썼을 때 딱히 이점이 없다.
'Learn > Architecture' 카테고리의 다른 글
[Design Pattern] Adapter Pattern (0) 2022.09.04 [Design Pattern] Singleton Pattern (0) 2022.08.31 [Design Pattern] Factory Method & Abstract Factory Patterns (0) 2022.08.29 [Design Pattern] Mediator Pattern (0) 2022.08.29 [Design Pattern] State Pattern (0) 2022.08.29