×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,101,745명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형

점층적 생성자 패턴

 

하나의 클래스에 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

 

반응형