Jaebi의 Binary는 호남선

Creational Patterns - Builder 본문

공부

Creational Patterns - Builder

jaebijae 2024. 6. 1. 19:37

목차 Open

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