본문 바로가기

java

[디자인패턴] 빌더(Builder) - 개념 정리,예제

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();
        }

    }
}

 

 

출처 : [실전자바 디자인 패턴]

digital.kyobobook.co.kr/digital/ebook/ebookDetail.ink?selectedLargeCategory=001&barcode=480D190421440&orderClick=LEa&Kc=

 

실전 자바 디자인 패턴

이 책은 GoF 디자인 패턴과 응용 패턴을 자바 언어로 설명하고 있다. 객체 지향 프로그래밍을 위한 기본 요소들과 자바로 구현하는 방법을 알아본다. 클래스 관계를 UML 클래스 다이어 그램으로

digital.kyobobook.co.kr

 

반응형