일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- LifeCycle
- SwiftUI
- singleton
- dart
- network
- Architecture
- WiFi
- builder
- philipshue
- weatherkit
- uikit
- dartz
- state
- concurrency
- factory
- iot
- swift
- AppleDeveloper
- Adapter
- EventLoop
- GIT
- WWDC24
- designpattern
- 문법
- flutter
- SampleApp
- OpenAI
- Xcode
- isolate
- tuist
Archives
- Today
- Total
Jaebi의 Binary는 호남선
Creational Patterns - Builder 본문
목차
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 |