Bulider Pattern
빌더 패턴은 생성 패턴(Creational Pattern) 중 하나이다.
빌더 패턴은 Optional한 멤버 변수 혹은 파라미터나 지속성 없는 상태 값들에 대해 처리해야하는 문제들을 해결합니다.
또한 별도의 Builder 클래스를 만들어 필수 값에 대해서는 생성자를 통해, 선택적인 값들에 대해서 메서드를 통해 Step-By-Step으로 값을 입력받은 후에 build()메서드를 통해 최종적으로 하나의 인스턴스를 리턴하는 방식이다.
빌더 패터은 굉장히 자주 사용되는 생성 패턴 중 하나로, Retorfit 이나 Okhttp 등 유명 오픈 소스서도 빌더 패턴을 사용하고 있다.
빌더 클래스를 Static Nested Class 로 생성한다, 관례적으로 생성하고자 하는 클래스 이름 뒤에 Builder를 붙인다. (예) Computer Class에 대한 빌더 클래스의 이름은 ComputerBuilder 라고 정의
빌더 클래스의 생성자는 public으로 하며, 필수 값들에 대해 생성자의 파라미터로 받는다.
Optional한 값들에 대해선 각각의 속성마다 메서드로 제공하며, 중요한 것은 메서드의 리턴 값이 빌더 객체 자신이어야 한다.
빌더 클래스 내의 Build() 메서드를 정의하여 클라이언트 프로그램에게 최종 생성된 결과물을 제공한다, 이렇게 build()를 통해서만 객체 생성을 제공하기 때문에 생성 대상이 되는 클래스의 생성자는 private으로 정의해야 한다.
public class Computer {
//required parameters
private String HDD;
private String RAM;
//optional parameters
private boolean isGraphicsCardEnabled;
private boolean isBluetoothEnalbed;
public String getHDD() {
return HDD;
}
public String getRAM() {
return RAM;
}
public boolean isGraphicsCardEnabled() {
return isGraphicsCardEnabled;
}
public boolean isBluetoothEnalbed() {
return isBluetoothEnalbed;
}
//Builder class
public static class ComputerBuilder {
//required parameters
private String HDD;
private String RAM;
public boolean isGraphicsCardEnabled;
public boolean isBluetoothEnalbed;
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 생성자가 없다는 것이다, 그렇기에 Computer 객체를 얻기 위해선 오직 ComputerBuilder 클래스를 통해서만 가능하다.
public class TestBuilderPattern {
public static void main(String[] args) {
Computer com = new Computer.ComputerBuilder("500GB", "2GB")
.setBluetoothEnabled(true)
.setGraphicsCardEnabled(true)
.build();
}
}
Computer 객체를 얻기 위해 ComputerBuilder 클래스를 사용하고 있으며 필수 값인 HDD 와 RAM 속성에 대해서 생성자로 받고 Optional한 값인 BluetoothEnabled 와 GraphicsCardEnalbed에 대해서 메서드를 통해 선택적으로 입력받고 있다.
즉, BluetoothEnabled 값이 필요없는 객체라면 setBluetoothEnabled() 메서드를 사용하지 않으면 된다.