반응형
디자인패턴
[Java][디자인 패턴] 5. 빌더 패턴 (Builder Pattern)
빌더 패턴은 추상 팩토리를 확장하여 크고 복잡한 객체를 생성할 수 있다.
빌더 패턴이란?
- 빌더 패턴은 복잡한 구조를 가진 복합 객체의 생성 과정을 분리하여 처리하는 패턴이다.
- 복합 객체의 생성 과정을 단계별로 분리함으로써 복합 객체의 생성을 일반화할 수 있다.
- 추상 클래스인 Builder는 추상 메서드 build()를 선언한다. build()는 복합 객체를 생성하는 로직을 하위 클래스에 위임한다.
빌더 패턴 구조
빌더 패턴을 사용하여 만든 각자의 환경에 맞는 Office를 구성하는 예시 코드이다.
(예시 코드를 조금 대충 만든 것 같기도 한데 그냥 빌더 패턴 구조를 파악하는데 의의를 두자)
빌더 패턴 코드
1.Builder 추상 클래스
public abstract class Builder {
protected Office office;
public Builder createOffice(){
office = new Office();
return this;
}
public abstract Builder buildWorkspace();
public abstract Builder buildPc();
public abstract Builder buildKeyboard();
public abstract Builder buildMouse();
public abstract Builder buildWorker();
public abstract Builder buildMonitor();
public abstract Office getOffice();
}
2. Office 클래스
public class Office {
private String workspace;
private String pc;
private String keyboard;
private String mouse;
private String worker;
private String monitor;
public void setWorkspace(String workspace) {
this.workspace = workspace;
}
public void setPc(String pc) {
this.pc = pc;
}
public void setKeyboard(String keyboard) {
this.keyboard = keyboard;
}
public void setMouse(String mouse) {
this.mouse = mouse;
}
public void setWorker(String worker) {
this.worker = worker;
}
public void setMonitor(String monitor) {
this.monitor = monitor;
}
@Override
public String toString() {
return worker + "는 오늘도 " + workspace + "에서 " +
pc + "과 " + keyboard + "과 " + mouse + "으로 " +
monitor + "을 보며 열일 중이다.";
}
}
3. Builder 클래스를 상속해서 만든 CompanyOfficeBuilder, HomeOfficeBuilder
public class CompanyOfficeBuilder extends Builder{
@Override
public Builder buildWorkspace() {
office.setWorkspace("회사");
return this;
}
@Override
public Builder buildPc() {
office.setPc("맥북");
return this;
}
@Override
public Builder buildKeyboard() {
office.setKeyboard("맥북 키보드");
return this;
}
@Override
public Builder buildMouse() {
office.setMouse("맥북 터치패드");
return this;
}
@Override
public Builder buildWorker() {
office.setWorker("직원");
return this;
}
@Override
public Builder buildMonitor() {
office.setMonitor("깐지나는 모니터 하나");
return this;
}
@Override
public Office getOffice() {
return office;
}
}
public class HomeOfficeBuilder extends Builder{
@Override
public Builder buildWorkspace() {
office.setWorkspace("스윗 마이 홈");
return this;
}
@Override
public Builder buildPc() {
office.setPc("맥북");
return this;
}
@Override
public Builder buildKeyboard() {
office.setKeyboard("키크론 K8");
return this;
}
@Override
public Builder buildMouse() {
office.setMouse("로지텍 MX Master");
return this;
}
@Override
public Builder buildWorker() {
office.setWorker("노예");
return this;
}
@Override
public Builder buildMonitor() {
office.setMonitor("빈티나는 모니터 두개");
return this;
}
@Override
public Office getOffice() {
return office;
}
}
4. Director 클래스
Builder 클래스를 사용해서 오피스를 구성해주는 클래스
public class Director {
private final Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void build() {
builder.createOffice()
.buildWorker()
.buildPc()
.buildMonitor()
.buildMouse()
.buildKeyboard()
.buildWorkspace();
}
public Office getOffice(){
return builder.getOffice();
}
}
5. 테스트 코드
class DirectorTest {
@Test
@DisplayName("회사에서 근무하는 환경을 만든다.")
void buildCompanyOfficeEnv() {
Builder companyOfficeBuilder = new CompanyOfficeBuilder();
Director director = new Director(companyOfficeBuilder);
director.build();
Office office = director.getOffice();
System.out.println(office.toString());
Assertions.assertEquals("직원는 오늘도 회사에서 맥북과 맥북 키보드과 맥북 터치패드으로 깐지나는 모니터 하나을 보며 열일 중이다.",
office.toString());
}
@Test
@DisplayName("집에서 근무하는 환경을 만든다.")
void buildHomeOfficeEnv() {
Builder companyOfficeBuilder = new HomeOfficeBuilder();
Director director = new Director(companyOfficeBuilder);
director.build();
Office office = director.getOffice();
System.out.println(office.toString());
Assertions.assertEquals("노예는 오늘도 스윗 마이 홈에서 맥북과 키크론 K8과 로지텍 MX Master으로 빈티나는 모니터 두개을 보며 열일 중이다.",
office.toString());
}
}
Github 코드
참고 자료
1.쉽게 바로 써먹는 디자인 패턴 책
http://www.yes24.com/Product/Goods/93173296
반응형
'개발 > 디자인패턴' 카테고리의 다른 글
[Java][디자인 패턴] 7. 어댑터 패턴 (Adapter Pattern) (0) | 2022.03.06 |
---|---|
[Java][디자인 패턴] 6. 프로토타입 패턴 (Prototype Pattern) (0) | 2022.03.05 |
[Java][디자인 패턴] 4. 추상 팩토리 패턴 (Abstract Factory Pattern) (0) | 2022.03.03 |
[Java][디자인 패턴] 3. 팩토리 메서드 패턴 (Factory Method Pattern) (0) | 2022.03.02 |
[Java][디자인 패턴] 2. 싱글턴 패턴 (Singleton Pattern) (0) | 2022.03.01 |