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