Builder Design Pattern
🔥 Flutter에서 Builder 패턴이 유용한 상황들
1. 복잡한 위젯 구성 (가장 흔함)
dart
// 복잡한 커스텀 버튼 위젯
class CustomButton {
final String text;
final Color? backgroundColor;
final Color? textColor;
final EdgeInsets? padding;
final BorderRadius? borderRadius;
final VoidCallback? onPressed;
final IconData? icon;
final double? elevation;
CustomButton._({
required this.text,
this.backgroundColor,
this.textColor,
this.padding,
this.borderRadius,
this.onPressed,
this.icon,
this.elevation,
});
// Builder 패턴 적용
static CustomButtonBuilder builder(String text) {
return CustomButtonBuilder._(text);
}
}
class CustomButtonBuilder {
final String _text;
Color? _backgroundColor;
Color? _textColor;
EdgeInsets? _padding;
BorderRadius? _borderRadius;
VoidCallback? _onPressed;
IconData? _icon;
double? _elevation;
CustomButtonBuilder._(this._text);
CustomButtonBuilder backgroundColor(Color color) {
_backgroundColor = color;
return this;
}
CustomButtonBuilder textColor(Color color) {
_textColor = color;
return this;
}
CustomButtonBuilder padding(EdgeInsets padding) {
_padding = padding;
return this;
}
CustomButtonBuilder rounded([double radius = 8.0]) {
_borderRadius = BorderRadius.circular(radius);
return this;
}
CustomButtonBuilder onPressed(VoidCallback callback) {
_onPressed = callback;
return this;
}
CustomButtonBuilder withIcon(IconData icon) {
_icon = icon;
return this;
}
CustomButtonBuilder elevation(double elevation) {
_elevation = elevation;
return this;
}
Widget build() {
return ElevatedButton.icon(
onPressed: _onPressed,
icon: _icon != null ? Icon(_icon) : SizedBox.shrink(),
label: Text(_text, style: TextStyle(color: _textColor)),
style: ElevatedButton.styleFrom(
backgroundColor: _backgroundColor,
padding: _padding,
shape: RoundedRectangleBorder(
borderRadius: _borderRadius ?? BorderRadius.zero,
),
elevation: _elevation,
),
);
}
}
// 사용법
Widget myButton = CustomButton.builder("확인")
.backgroundColor(Colors.blue)
.textColor(Colors.white)
.rounded(12.0)
.padding(EdgeInsets.symmetric(horizontal: 24, vertical: 12))
.withIcon(Icons.check)
.elevation(4.0)
.onPressed(() => print("클릭됨"))
.build();2. 네트워크 요청 설정
dart
3. 다이얼로그 Builder
dart
4. Director 패턴을 활용한 테마 Builder
dart
🎯 Builder 패턴을 사용해야 하는 경우
✅ 사용하면 좋은 상황
생성자 매개변수가 5개 이상
선택적 매개변수가 많은 경우
불변 객체를 만들고 싶은 경우
복잡한 설정이 필요한 객체
같은 구조로 다양한 변형이 필요한 경우
❌ 사용하지 않는 것이 좋은 상황
간단한 객체 (매개변수 3개 이하)
자주 변경되지 않는 객체
성능이 매우 중요한 경우 (객체 생성 오버헤드)
💡 핵심 정리
Builder: 객체를 "어떻게" 만들지 정의
Director: 객체를 "무엇을", "어떤 순서로" 만들지 지시
Last updated