GiYeong
Builder Pattern 본문
빌더 패턴
- 생성과 관련된 디자인 패턴으로, 복잡한 객체를 생성하는 클래스와 표현하는 클래스를 분리하여 동일한 절차에서도 서로 다른 표현을 생성하는 방법을 제공
- 생성해야하는 객체가 Optional한 속성을 많이 가질 때 효율적
사용 이유
많은 Optional한 멤버 변수 또는 파라미터, 지속성 없는 상태 값들에 대해 처리해야하는 문제들을 해결
예를 들어 팩토리 패턴이나 추상 팩토리 패턴에서 생성해야하는 클래스에 대한 속성 값이 많을 때 아래와 같은 이슈가 발생한다.
- 클라이언트 프로그램에서 팩토리 클래스로 많은 파라미터를 넘겨줄 때, 타입, 순서 등에 대한 관리가 어려워져 에러가 발생할 수 있다.
- 경우에 따라 필요없는 파라미터들에 대해 팩토리 클래스에 일일히 null 값을 넘겨줘야 한다.
- 생성해야하는 sub 클래스가 무거워지고 복잡해짐에 따라 팩토리 클래스 또한 복잡해진다.
장점
- 필요한 데이터만 설정할 수 있다.
- 유연성을 확보할 수 있다.
- 가독성을 높일 수 있다.
- 불변성을 확보할 수 있다.
예제
public class Computer {
//required parameters
private String HDD;
private String RAM;
//optional parameters
private boolean isGraphicsCardEnabled;
private boolean isBluetoothEnabled;
public String getHDD() {
return HDD;
}
public String getRAM() {
return RAM;
}
public boolean isGraphicsCardEnabled() {
return isGraphicsCardEnabled;
}
public boolean isBluetoothEnabled() {
return isBluetoothEnabled;
}
private Computer(ComputerBuilder builder) {
this.HDD=builder.HDD;
this.RAM=builder.RAM;
this.isGraphicsCardEnabled=builder.isGraphicsCardEnabled;
this.isBluetoothEnabled=builder.isBluetoothEnabled;
}
//Builder Class
public static class ComputerBuilder{
// required parameters
private String HDD;
private String RAM;
// optional parameters
private boolean isGraphicsCardEnabled;
private boolean isBluetoothEnabled;
public ComputerBuilder(String hdd, String ram){
this.HDD=hdd;
this.RAM=ram;
}
public ComputerBuilder setGraphicsCardEnabled(boolean isGraphicsCardEnabled) {
this.isGraphicsCardEnabled = isGraphicsCardEnabled;
return this;
}
public ComputerBuilder setBluetoothEnabled(boolean isBluetoothEnabled) {
this.isBluetoothEnabled = isBluetoothEnabled;
return this;
}
public Computer build(){
return new Computer(this);
}
}
}
- Computer 클래스가 setter 없이 getter만 가지며, public 생성자가 없다.
- 따라서 객체를 얻기 위해서는 오직 builder 클래스를 통해서만 가능하다.
public class TestBuilderPattern {
public static void main(String[] args) {
Computer comp = new Computer.ComputerBuilder("500 GB", "2 GB")
.setBluetoothEnabled(true)
.setGraphicsCardEnabled(true)
.build();
}
}
- 필수 값은 생성자로 받고, Optional한 값은 메서드를 통해 선택적으로 입력받는다.
'CS > Java' 카테고리의 다른 글
Factory Pattern (0) | 2022.09.07 |
---|---|
Singleton Pattern (0) | 2022.09.07 |
Java - 6 (0) | 2022.06.13 |
Java - 5 (0) | 2022.06.11 |
Java - 4 (0) | 2022.06.10 |
Comments