반응형

점층적 생성자 패턴

 

하나의 클래스에 5개의 멤버변수가 있다고 가정해보자.

그리고 해당 멤버 변수는 초기화를 해도 되고, 안해도 된다.

 

하지만 해당하는 멤버변수들의 모든 경우의 수에 대해 생성자를 만들고 싶다면

 

5C0+5C1+5C2+5C3+5C4+5C5 = 31개를 만들어야 할 것이다.

(아무 인자가 없는 생성자부터 5개 모두있는 인자까지 만들려면)

 

이렇게 하나하나 생성자를 만드는 패턴을 점층적 생성자 패턴이라고 한다.

 

하지만, 이는 개발에 있어 군더더기 많은 코드가 될 것임은 구현해보지 않아도 알 것이다.

 

따라서 생성자에 매개변수가 많은 경우에는 빌더 패턴을 고려해야 한다.

 

 

아래에 바로 빌더 패턴의 예제를 들고자 한다.

 

public class Robot {
    private final String name;
    private final String weapon;
    private final int arm;

    public static class Builder {
        // 필수 매개변수
        private final String name;

        // 선택 매개변수
        private String weapon;
        private int arm;

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

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

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

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

    private Robot(Builder builder) {
        this.name = builder.name;
        this.weapon = builder.weapon;
        this.arm = builder.arm;
    }

    public int getArm() {
        return arm;
    }

    public String getName() {
        return name;
    }

    public String getWeapon() {
        return weapon;
    }
}

 

Robot 클래스가 있고 내부에 Robot을 build하는 Builder static 클래스가 있다.

이는 Builder라는 객체를 통해 Robot이 가지고 있는 매개변수를 그대로 가져올 수 있고, 필수 혹은 선택적인 매개변수를 지정하여 빌드 할 수 있게 도와준다.

 

모든 값들을 다 설정한 후 build 메서드를 호출하면 Robot를 생성하게 되는데 이때 Robot 생성자는 Builder가 가지고 있던 데이터를 모두 넣어줌으로써 Robot이 build된다.

 

이때 Robot의 생성자는 private로 하나뿐이지만, 자유자제로 매개변수에 값들을 넣을 수 있음을 알 수 있다.

 

public class Main {
    public static void main(String []args) {
        Robot carBot = new Robot.Builder("CarBot") // 필수 인자
                .weapon("Sword") // 선택 인자
                .arm(2)
                .build();

        System.out.println("name : " + carBot.getName());
        System.out.println("weapon : " + carBot.getWeapon());
        System.out.println("arm : " + carBot.getArm());
    }
}
> Task :Main.main()
name : CarBot
weapon : Sword
arm : 2

BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed

 

반응형