1. 정의
상위클래스에서 인터페이스를 받아 구현한 하위 클래스가 부분 객체를 생성하고,
디렉터 클래스가 조립 절차에 따라 객체를 조립하여 복합객체를 생성한다.
대충 이런 느낌 아닐까? (생각중.. )
2. 구성 요소
구성요소는 3개가 필요하다 - 상위 클래스, 하위 클래스, 디렉터 클래스
1. 상위클래스에서는 공통으로 사용할 객체와 인터페이스를 정의하고 하위클래스에서 사용할 추상(Abstract) 메서드를 선언한다.
2. 하위클래스에서는 상위클래스를 상속 받고 추상메서드를 오버라이드 하여 구현한다.
3. 디렉터 클래스에서는 인터페이스를 사용해서 상위클래스에 대한 의존성을 주입하고 하위 클래스들에 대한 객체를 받아 각 부분을 조립하는 메서드를 제공한다.
3. 장점
- 여러 단계와 다양한 절차를 통해서 객체를 만들수 있다.
- 복합객체의 내부 구조를 클라이언트로부터 보호 한다.
- 복합객체 생성 과정을 클래스화 하여 복합 객체를 동일하게 생성 하는 여러 곳의 코드 중목을 막아준다.
4. 사용 예
- 복합 객체 구조 구축 용도
- 변동된 시세를 클라이언트에게 보여줄 수 있도록 하는 UI 를 개발 하는데 사용
5. 예제
상위클래스
1 AbstractOperationBuilder.java 연산
하위클래스
2-1 AddOperationBuilder.java / 덧셈
2-2 DivideOperationBuilder.java / 나눗셈
2-3 SubstractOperationBuilder.java / 뺄셈
디렉터 클래스
3. OperationDirector.java / 덧셈, 나눗셈, 뺄셈 다 받아서 조립후 출력~
클라이언트 클래스
4. BuilderClient.java / 디렉터 클래스의 사용예시
예제)
1. AbstractOperationBuilder.java)
package Builder;
public abstract class AbstractOperationBuilder {
protected StringBuffer result = new StringBuffer();
private int firstNumber;
private int secondNumber;
public AbstractOperationBuilder(int firstNumber, int secondNumber) {
this.firstNumber = firstNumber;
this.secondNumber = secondNumber;
}
public abstract int operate(int firstNumber, int secondNumber);
public abstract void buildOperator();
public final void buildFirstNumber(){
result.append(firstNumber);
}
public final void buildSecondNumber(){
result.append(secondNumber);
}
public final void buildAnswer(){
int answer = operate(firstNumber, secondNumber);
result.append("=" + answer);
}
public final StringBuffer getResult(){
return result;
}
}
2-1. AddOperationBuilder.java
package Builder;
public class AddOperationBuilder extends AbstractOperationBuilder {
public AddOperationBuilder(int firstNumber, int secondNumber){
super(firstNumber, secondNumber);
}
@Override
public int operate(int firstNumber, int secondNumber) {
return firstNumber + secondNumber;
}
@Override
public void buildOperator() {
result.append("+");
}
}
2-2. DivideOperationBuilder.java
package Builder;
public class DivideOperationBuilder extends AbstractOperationBuilder{
public DivideOperationBuilder(int firstNumber, int secondNumber) {
super(firstNumber, secondNumber);
}
@Override
public int operate(int firstNumber, int secondNumber) {
return firstNumber/ secondNumber;
}
@Override
public void buildOperator() {
result.append("/");
}
}
2-3. SubstractOperationBuilder.java
package Builder;
public class SubstractOperationBuilder extends AbstractOperationBuilder{
public SubstractOperationBuilder(int firstNumber, int secondNumber) {
super(firstNumber, secondNumber);
}
@Override
public int operate(int firstNumber, int secondNumber) {
return firstNumber - secondNumber;
}
@Override
public void buildOperator() {
result.append("-");
}
}
3. OperationDirector.java
package Builder;
public class OperationDirector {
private AbstractOperationBuilder builder;
public OperationDirector(AbstractOperationBuilder builder) {
this.builder = builder;
}
public void construct(){
builder.buildFirstNumber();
builder.buildOperator();
builder.buildSecondNumber();
builder.buildAnswer();
StringBuffer result = builder.getResult();
print(result);
}
private void print(StringBuffer result) {
System.out.println(result);
}
}
4. BuilderClient.java
package Builder;
public class BuilderClient {
public static void main(String[] args) {
int firstNumber = 100;
int secondNumber = 20;
AbstractOperationBuilder[] operationBuilders = new AbstractOperationBuilder[3];
operationBuilders[0] = new AddOperationBuilder(firstNumber, secondNumber);
operationBuilders[1] = new SubstractOperationBuilder(firstNumber, secondNumber);
operationBuilders[2] = new DivideOperationBuilder(firstNumber, secondNumber);
for(int i=0; i< operationBuilders.length; i++){
OperationDirector operationDirector = new OperationDirector(operationBuilders[i]);
operationDirector.construct();
}
}
}
출처 : [실전자바 디자인 패턴]
'java' 카테고리의 다른 글
[자바 병렬 처리 - 포크/ 조인 프레임 워크] (0) | 2021.04.17 |
---|---|
[JAVA]스트림(Stream) 에서 기본형(Primitive type)은 왜 취약할까? (0) | 2021.04.13 |
[JAVA 개념] 추상클래스와 인터페이스의 차이점 ( + 상속과 구현) (0) | 2021.04.11 |
[Effective java] Item 7 - 종료자(finalize) 사용을 피하라 (0) | 2021.01.30 |
[Effective Java] Item 6 - 유효기간이 지난 객체 참조는 폐기하라. (0) | 2021.01.30 |