Jaebi의 Binary는 호남선

Creational Patterns - Builder 본문

공부

Creational Patterns - Builder

jaebijae 2024. 6. 1. 19:37

목차

    Builder

    • 객체를 생성하는 방법표현하는 방법을 정의 하는 클래스를 별도로 분리하여, 다른 표현이라도 생성할 수 있는 동일한 절차를 제공
    • 복잡한 객체의 생성 프로세스(Logic)를 객체(Data) 자체에서 분리
    • 동기: 집을 짓고 있다고 가정 → 집 (object)를 짓기 위한 건설 단계 (build logic - 기초, 바닥, 벽, 문, 지붕 등)은 거의 동일 함 → 건설 단계는 같지만, 각 단계는 조정되어 최종 결과는 완전히 달라 보이게됨 → 객체의 생성 프로세스를 추상화 하여 다른 표현(최종 결과물)을 제공 할 수 있게 구성 단계를 조정 가능하게 함
    • 활용성:
      • 복합 객체의 생성 알고리즘이 요소 객체와 조립 방법에 독립적임
      • 합성할 객체들의 표현이 서로 다르더라도 생성 절차에서 이를 지원해야함
    • 사용:
      • 객체에 많은 매개변수 (parameters)가 있을시
      • 복잡한 생성작업을 한번의 호출 체인으로 처리 할시

    구조

    • 구조:
      • Builder: Product 객체의 일부 요소들을 생성하기 위한 추상 인터페이스
      • ConcreteBuilder: Builder 클래스에 정의된 인터페이스를 구현, 부품들을 모아 빌더를 폭함함, 생성한 요소의 표현을 정리 및 관리
      • Director: 서브 Builder 인터페이스를 사용하는 객체를 합성
      • Product: 생성할 복합 객체를 표현
    • 장점:
      • 필요한 데이터만 설정 가능 - optional parameter가 있을때 생성자나 정적 메소드를 사용하면 더미 값을 넣거나 해당 parameter가 없는 생성자를 따로 만들어줘야함 (요구사항이 게속 변동되면 시간낭비), 빌더로 테스트용 객체 생성이나 불필요한 코드 양 줄임
      • 복합 객체를 생성하는 절차를 세밀하게 분리 가능
      • 코드 가독성 높임 - 생성과 표현에 필요한 코드 분리, optional named parameter가 아닌 이상 각 parameter가 뭘 의미 하는지 모름, 직관적으로 어떤 값이 설정되고 파악 가능
      • 유연성 확보 - 제품에 대한 내부 표현을 다양하게 변화 가능, 객체에 새로운 변수가 추가되어야 하면 기존의 코드를 수정해야함 (양이 많으면 감당 불가), 빌더로 기존 코드에 영향 주지 않음
    • Sample Code:
    class House {
      final String? wallColor;
      final String? roofColor;
      final int? numberRooms;
      final bool? hasBasement;
      final int? numberDoors;
      House({
        this.wallColor,
        this.roofColor,
        this.numberRooms,
        this.hasBasement,
        this.numberDoors,
      });
    }
    class HouseBuilder {
      String _wallColor = 'White';
      String _roofColor = 'Red';
      int _numberRooms = 2;
      bool _hasBasement = false;
      int _numberDoors = 3;
      HouseBuilder setWallColor(String color) {
        _wallColor = color;
        return this;
      }
      HouseBuilder setRoofColor(String color) {
        _roofColor = color;
        return this;
      }
      HouseBuilder setNumberRooms(int numberOfRooms) {
        _numberRooms = numberOfRooms;
        return this;
      }
      HouseBuilder setHasBasement(bool hasBasement) {
        _hasBasement = hasBasement;
        return this;
      }
      HouseBuilder setNumberDoors(int numberOfDoors) {
        _numberDoors = numberOfDoors;
        return this;
      }
      House build() {
        return House(
          wallColor: _wallColor,
          roofColor: _roofColor,
          numberRooms: _numberRooms,
          hasBasement: _hasBasement,
          numberDoors: _numberDoors,
        );
      }
    }
    void main() {
      House smallHouse = HouseBuilder()
      .setWallColor('blue')
      .setRoofColor('red')
      .setNumberRooms(1)
      .setHasBasement(false)
      .setNumberDoors(2)
      .build();
    House bigHouseWithPool = HouseBuilder()
      .setWallColor('green')
      .setRoofColor('red')
      .setNumberRooms(4)
      .setHasBasement(true)
      .build();
    House blackHouse = HouseBuilder()
      .setWallColor('black')
      .build();
    }
    • 플러터에서는 생성자를 호출하여 위젯을 생성 → 빌더 패턴보다 더 간단함
      • 필요시 빌더위젯을 제공 → 동적 데이터 또는 상위 위젯의 레이아웃 제약 조건에 따라 달라지는 위젯을 구성하는데 사용
      • callback으로 위젯을 만들어 위젯 구성과 설정을 나눔

    '공부' 카테고리의 다른 글

    Creational Patterns - Factory Method  (0) 2024.06.01
    Creational Patterns - Singleton  (2) 2024.06.01
    Design Pattern  (0) 2024.06.01
    Mobile Clean Architecture  (0) 2024.06.01
    Tistory 관련 유용한 링크들  (0) 2024.02.15