-
Notifications
You must be signed in to change notification settings - Fork 0
Builder Pattern
Namgyu Park edited this page Jul 11, 2020
·
13 revisions
생성자 (constructor) 의 인자값들을 다양하게 조합해서 사용해야 할 때,
생성자 (constructor) 가 쓸데없이 많아지는 코드를 방지하기 위해 사용하는 Design Pattern
클래스 내부에 Builder 클래스가 존재하여 Builder 를 이용해 필요한 값들만 받을 수 있도록 하며, Builder 인스턴스를 클래스의 확장자 인자로 받아 생성된 클래스 인스턴스로만 접근 가능하도록 하는 디자인 패턴
예를 들어, A 서비스에 접근할 수 있는 access token 을 생성하는 라이브러리를 만들어 외부에 배포한다고 가정시 외부 3rd party 의 상황에 따라서 필요한 인자값들이 다 동일하지 않을 수 있다.
- 나는 custom domain url을 설정해서 테스트 하고 싶어.
- 나는 A 서버스 앱으로 부터 access token 을 받는 것이 아니라 웹브라우저를 통해서 access token 을 가져오고 싶은데?
- 우리 서비스에는 필요없는 값들을 왜 생성자에 넣도록 요구하는거야? 헷갈려..
코드 예시
public class FrameworkSettings {
private String clientId;
private String clientSecret;
private String firmwareVersion;
private String extraInfo;
private String modelId;
FrameworkSettings(Builder builder) {
this.clientId = builder.clientId;
this.clientSecret = builder.clientSecret;
this.firmwareVersion = builder.firmwareVersion;
this.extraInfo = builder.extraInfo;
this.modelId = builder.modelId;
}
public String getClientId() {
return clientId;
}
public String getClientSecret() {
return clientSecret;
}
public String getFirmwareVersion() {
return firmwareVersion;
}
public String getExtraInfo() {
return extraInfo;
}
public String getModelId() {
return modelId;
}
public static class Builder {
private String clientId;
private String clientSecret;
private String firmwareVersion;
private String extraInfo;
private String modelId;
public Builder setClientId(String clientId) {
this.clientId = clientId;
return this;
}
public Builder setClientSecret(String clientSecret) {
this.clientSecret = clientSecret;
return this;
}
public Builder setFirmwareVersion(String firmwareVersion) {
this.firmwareVersion = firmwareVersion;
return this;
}
public Builder setExtraInfo(String extraInfo) {
this.extraInfo = extraInfo;
return this;
}
public Builder setModelId(String modelId) {
this.modelId = modelId;
return this;
}
public FrameworkSettings build() {
if (clientId == null)
throw new RuntimeException("ClientId can't be null!");
return new FrameworkSettings(this);
}
}
}