Justin의 개발 로그

[용도]

빌더 패턴은 생성해야 되는 객체가 Optional한 속성을 많이 가질 때

생성자의 복잡도를 낮추면서 객체의 속성이 final 특성을 가지도록 만들어야 할 때

 

[생성 방법]

  1. 빌더 클래스를 Static Nested Class로 생성합니다. 이때, 관례적으로 생성하고자 하는 클래스 이름 뒤에 Builder를 붙입니다.
  2. 빌더 클래스의 생성자는 public으로 하며, 필수 값들에 대해 생성자의 파라미터로 받습니다.
  3. 옵셔널한 값들에 대해서는 각각의 속성마다 메소드로 제공하며, 이때 중요한 것은 메소드의 리턴 값이 빌더 객체 자신이어야 합니다.
  4. 마지막 단계로, 빌더 클래스 내에 build() 메소드를 정의하여 클라이언트 프로그램에게 최종 생성된 결과물을 제공합니다. 이렇듯 build()를 통해서만 객체 생성을 제공하기 때문에 생성 대상이 되는 클래스의 생성자는 private으로 정의해야 합니다.
public class Car {
    private final String brand;
    private final String engine;
    private final String name;
    private final int price;

    // 직접 생성 못하도록 Private으로...
    private Car(Builder builder) {
        this.brand = builder.brand;
        this.engine = builder.engine;
        this.name = builder.name;
        this.price = builder.price;
    }

    @Override
    public String toString() {
        return String.format("이름 : %1s, 엔진 : %2s, 브랜드 : %3s, 가격 : %4d", name, engine, brand, price);
    }

    //내부 static 클래스로 빌더
    public static class Builder {
        private String brand;
        private String engine;
        private String name;
        private int price;

        // 필수적인 필드 : brand
        public Builder Brand(String brand) {
            this.brand = brand;
            return this;
        }

        public Builder Engine(String engine) {
            this.engine = engine;
            return this;
        }

        public Builder Name(String name) {
            this.name = name;
            return this;
        }

        public Builder Price(int price) {
            this.price = price;
            return this;
        }

        public Car build() {
            return new Car(this);
        }
    }
}

public class TestBuilderPattern {
    public static void main(String[] args)  {
        Car car = new Car.Builder()
                .Name("슈퍼카")
                .Brand("페라리")
                .Engine("3.0V6")
                .Price(150000)
                .build();

        System.out.println(car.toString());
    }
}
profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!