Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- PostgreSQL
- 프록시패턴 #Gof #ProxyPattern #Proxy
- 자바 #인터페이스 #추상클래스 #abstract #
- 데이터베이스
- MariaDB #DB #기본쿼리 #select
- CentOS
- Bridge Pattern #구조패턴 #Structure Pattern
- GoF #빌더패턴 #Builder Pattern
- GOF #
Archives
- Today
- Total
개발자 기초부터 시작하기
생성패턴(Creational Pattern) - Builder Pattern 본문
<!doctype html>
생성패턴(Creational Pattern) - Builder Pattern
목적
객체의 construction 과정과 객체의 representation을 분리
이렇게 분리함으로 하나의 construction 과정을 이용해 서로 다른 형태의 representation 을 이용할 수 있음 => 하나의 Director로 상위 Builder에 표현된 다른 하위 Builder를 이용할 수 있음.
복잡한 객체의 단계별 생성
각기 다른 능력을 가진 객체를 생성하는데 있어서 통일 된 방식을 제공한다는 것.
UML Diagram
-
Builder
- Product 객체의 부분을 생성하기위한 추상 인터페이스를 지정합니다.
-
ConcreteBuilder
- Builder 인터페이스를 구현하여 제품의 일부를 구성하고 어셈블합니다.
- 작성한 표현을 정의하고 추적합니다
- 제품 검색을위한 인터페이스를 제공합니다.
-
Director
- Builder 인터페이스를 사용하여 객체를 생성합니다.
-
Product
- 생성중인 복합 객체를 나타냅니다. ConcreteBuilder는 제품의 내부 표현을 작성하고 조립 과정을 정의합니다.
- 최종 결과로 부품을 조립하기위한 인터페이스를 포함하여 구성 부품을 정의하는 클래스를 포함합니다.
Builder Pattern 을 RTF 문서판독기에 적용한 모습
적용 내용
-
RTFReader = Director // Product = 결과물 // Builder = TextConverter // ConcreteBuilder = 각 Converter
-
하나의 생성과정에 다른 능력을 가진 객체를 생성하기 위해 인터페이스로 구현된 TextConverter가 필요
-
그 인터페이스를 통해 상세 구현체를 알 필요 없이 통일된 방식 그대로를 생성해 줄 뿐(상세 구현체는 client 결정)
-
다른 예로 하나씩 따로 따로 내부의 객체를 생성해서 하나로 묶거나 리턴하는 식으로도 많이 활용된다.
자바에서의 빌더 패턴
회원가입 에 필요한 Member 객체를 만드는데 아이디와 패스워드만 필수정보이고, 나머지는 입력하지 않아도 상관없을때 빌더패턴을 유용하게 활용할 수 있다.
public interface Buildable <T>{
T build();
}
x
public class Member {
// 회원가입 입력양식
private String id;
private String pw;
private String name;
private String email;
private int age;
private String phone;
private String address;
public Member() {}
public static class Builder implements Buildable<Member>{
// 필수적으로 필요한 정보
private final String id;
private final String pw;
// 선택적으로 필요한 정보
private String name;
private String email;
private int age;
private String phone;
private String address;
// 필수적으로 필요한 정보들에 대한 생성자
public Builder(String id, String pw) {
this.id = id;
this.pw = pw;
}
// 선택적으로 필요한 정보들에 대한 정보를 받고 미완성된 객체들을 전달할 메소드
public Builder name(String name) {
this.name = name;
return this;
}
public Builder email(String email) {
this.name = email;
return this;
}
public Builder age(String age) {
this.name = age;
return this;
}
public Builder phone(String phone) {
this.name = phone;
return this;
}
public Builder address(String address) {
this.name = address;
return this;
}
// 메소드의 최종에 사용해 완성된 객체를 어떤 상황에서도 반환
@Override
public Member build() {
// TODO Auto-generated method stub
return new Member(this);
}
}
public Member(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.email = builder.email;
this.age = builder.age;
this.phone = builder.phone;
this.address = builder.address;
}
}
활용 결과
xxxxxxxxxx
Member member1 = new Member.Builder("문상수", "1234")
.age("27")
.address("강남")
.email("mshero7")
.build();
빌더 패턴의 장단점
-
장점
- 복합 객체가 생성되는 과정을 캡슐화합니다.
- 여러 단계와 다양한 절차를 통해 다양한 객체를 만들 수 있다.
- 제품의 내부 구조를 보호할 수 있다.
- 추상 인터페이스만 볼 수 있기 때문에 구현한 코드를 쉽게 바꿀 수 있다.
-
단점
- 사용자는 제품의 내부 구조를 정의한 크래스는 전혀 모른채 빌더와의 상호작용만으로 구성됨
- 복합 객체 구조를 구축하기 위한 용도로 많이 쓰입니다.
- 팩토리를 사용하는 경우에 비해 객체를 만들기 위해서 클라이언트에 대해 더 많이 알아야 함.
참고자료
'스터디 > Gof 디자인 패턴' 카테고리의 다른 글
구조패턴(Structural Pattern) - Bridge Pattern (0) | 2019.05.10 |
---|---|
구조패턴(Structural Pattern) - 프록시 패턴 (0) | 2019.05.08 |
Comments