1. 점층적 생성자 패턴
Car.java
public class Car {
private final int a;
private final int b;
//...
private final int e;
public Car(int a, int b, int c, int d, int e) {
this.a = a;
this.b = b;
this.c = c;
this.d = d;
this.e = e;
}
public Car(int a, int b, int c, int d) {
this(a, b, c, d, 0);
}
public Car(int a, int b, int c) {
this(a, b, c, 0);
}
public Car(int a, int b) {
this(a, b, 0);
}
}
필수 매개 변수만 받는 생성자와 필수 매개 변수 및 선택 매개 변수를 받는 생성자들을 점층적으로 만들어서 사용하는 패턴이다. 원하는 매개변수를 포함한 생성자 중 가장 짧은 것을 사용하여 인스턴스를 제작한다.
매개변수가 많아지면 클라이언트가 코드를 읽고 쓰는 것이 어려워진다. 각 값이 어떤 의미인지 한 번에 파악하기 어렵기 때문이다.
2. Java Beans 패턴
Car.java
public class Car {
private int a = 0;
private int b = 0;
private int c = 0;
private int d = 0;
private int e = 0;
public Car() {
}
//각 필드들에 대한 setter
}
각 필드들에 기본값을 주고 객체를 생성할 때 setter를 사용한다.
Main.java
Car car = new Car();
car.setA(1);
car.setB(100);
//...
car.setE(-1);
객체를 생성하기 위해 여러 메서드를 호출해야 하며, 객체가 완전히 생성되기 전까지는 일관성이 파괴되는 단점이 있다. 또한 클래스를 불변으로 생성할 수 없기 때문에 스레드 안정성 추가 작업이 필요하다.
3. Builder 패턴
Car.java
public class Car {
private final int a;
private final int b;
private final int c;
private final int d;
public Car(Builder builder) {
a = builder.a;
b = builder.b;
c = builder.c;
d = builder.d;
}
public static class Builder {
//필수 매개변수
private final int a;
private final int b;
//선택 매개변수
private int c = 0;
private int d = 0;
public Builder(int a, int b) {
this.a = a;
this.b = b;
}
public Builder c(int c) {
this.c = c;
return this;
}
public Builder d(int d) {
this.d = d;
return this;
}
public Car build() {
return new Car(this);
}
}
}
Car 클래스는 불변이며, 내부 Builder 클래스의 메서드 체이닝을 응용한다.
Main.java
Car car = new Car.Builder(3, 0)
.c(-1)
.d(1000)
.build();
Car car2 = new Car.Builder(1, -1)
.d(99)
.build();
필수 매개변수는 Builder 객체를 생성할 때 대입하며, 선택 매개 변수는 내부 Builder 클래스에 정의된 매칭 메서드를 이용한다. 이를 통해 현재 사용자가 대입하는 값이 어떤 매개변수에 대입되는지 간단하게 확인할 수 있다.
빌더 패턴은 계층적으로 설계된 클래스에서 사용하기 좋다. 생성 비용이 큰 것은 아니지만 성능에 민감한 상황에서는 문제가 될 수 있다. 또한 매개변수가 4개 이상은 되어야 효율적이다.
※ Lombok을 이용한 Builder 어노테이션을 사용한 사례
'Prodo 독서 리뷰' 카테고리의 다른 글
[Effective Java] Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2021.04.11 |
---|---|
[Effective Java] Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2021.04.11 |
[Effective Java] Item 1. 생성자 대신 정적 팩토리 메서드를 고려하라 (0) | 2021.04.11 |
[오브젝트] 15장 디자인 패턴과 프레임워크 (0) | 2021.04.10 |
[오브젝트] 13장 서브클래싱과 서브타이핑 (0) | 2021.04.10 |