ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] Builder Pattern
    Learn/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);
        }
    }

     

    # 유의사항

    인터페이스가 자주 바뀐다면 이 패턴을 썼을 때 딱히 이점이 없다. 

     

     

    댓글

Designed by Tistory.