반응형
점층적 생성자 패턴
하나의 클래스에 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
반응형
'Basic > Java' 카테고리의 다른 글
[Effective Java] 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2021.01.28 |
---|---|
[Effective Java] Private 생성자나 열거타입으로 싱글턴임을 보증하라 (0) | 2021.01.27 |
[Effective Java] 생성자 대신 정적 팩토리 메서드를 고려하라 (0) | 2021.01.25 |
Java 현재 시간으로부터 상대적 시간 계산(두 시간 차 계산) (0) | 2020.10.14 |
[Java] 16진수를 10진수로, 10진수를 16진수로 변경하기 (0) | 2020.08.18 |