[JAVA 디자인패턴] Builder 패턴 정리

Builder 패턴이란?

복잡한 것을 만들 때는 전체를 한꺼번에 만들기보다는 작게 분리하여 만든 후 다시 합치는 것이 편리하다. builder 패턴은 복잡한 인스턴스를 조립하여 만드는 구조로, 복합 객체를 생성할 때 객체를 생성하는 방법(과정)과 객체를 구현(표현)하는 방법을 분리한다. 따라서 이 패턴은 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있다.

  • Builder : Product 객체의 일부 요소들을 생성하기 위한 추상 인터페이스 제공.
  • ConcreteBuilder : Builder 클래스에 정의된 인터페이스를 구현하며, 제품의 부품들을 모아 빌더를 복합한다.
  • Director : Builder 인터페이스를 사용하는 객체를 합성한다.
  • Product : 생성할 복합 객체를 표현

설명만 들어면 굉장히 어려운데, 사실 빌더 패턴은 굉장히 간단한 패턴이다. abstract method 패턴과 굉장히 유사한데 별도의 Director가 builder(추상클래스)를 갖고 builder를 통해서 세부적인 작업후 생성된 오브젝트를 리턴하는 패턴이다.


Builder 패턴구현

abstract Builder Class

makeHeader, makeBody, makeFooter라는 세부작업을 갖는 추상클래스.

public abstract class Builder {

	public abstract void makeHeader(String title);
	public abstract void makeBody(String body);
	public abstract void makeFooter(String tail);
	public abstract String getResult();

}


extends Builder class

builder를 상속받은 하위 클래스로 제일 상단 UML에서 concreteBuilder에 해당한다. PlainTextBuilder, HtmlBuilder로 각각 두개의 Builder를 다르게 구현했다.

// PlainText ConcreteBuilder 입력받은 텍스트를 그대로 빌딩함
public class PlainTextBuilder extends Builder {

	private StringBuilder sb = new StringBuilder();

	@Override
	public void makeHeader(String title) {
		sb.append(title).append("\n");
	}

	@Override
	public void makeBody(String body) {
		sb.append(body).append("\n");
	}

	@Override
	public void makeFooter(String footer) {
		sb.append(footer).append("\n");
	}

	public String getResult() {
		return sb.toString(); 
	}
}
// PlainText ConcreteBuilder 입력받은 텍스트를 HTML로 감싸서 빌딩함
public class HtmlBuilder extends Builder {
	
	private StringBuilder sb = new StringBuilder();
	
	@Override
	public void makeHeader(String title) {
		sb.append("\n");
		sb.append("\n");
		sb.append(title).append("\n");
		sb.append("\n");
	}

	@Override
	public void makeBody(String body) {
		sb.append("\n");
		sb.append(body).append("\n");
		sb.append("\n");
	}

	@Override
	public void makeFooter(String footer) {
		sb.append(footer).append("\n");
		sb.append("");
	}
	
	public String getResult() {
		return sb.toString();
	}
}


Director Class

abstract class로 정의된 Builder를 직접 갖고 있는 Class로 make() 메소드에서 builder의 값을 세팅해준다.

public class Director {
	
	private Builder builder;
	
	public Director(Builder builder) {
		this.builder = builder;
	}
	
	public void make() {
		builder.makeHeader("header 입니다.");
		builder.makeBody("body 내용입니다.");
		builder.makeFooter("footer 입니다.");
	}
	
	public String getReslt() {
		return builder.getResult();
	}
}


Main Class PlainTextBuilder 사용시 

public class Main {
	public static void main(String[] args) {
		Director director = new Director(new PlainTextBuilder());
		director.make();
		String result = director.getReslt();
		System.out.println(result);
	}
}

/* 수행결과 */

header 입니다.

body 내용입니다.

footer 입니다.


Main Class HtmlBuilder 사용시 

public class Main {
	public static void main(String[] args) {
		Director director = new Director(new HtmlBuilder());
		director.make();
		String result = director.getReslt();
		System.out.println(result);
	}
}

/* 수행결과 */

<html>

<title>

header 입니다.

</title>

<body>

body 내용입니다.

</body>

footer 입니다.

</html>


위 처럼 Builder 패턴은 복잡한 인스턴스 생성 및 세팅과정을 모두 Director에게 떠넘기고 Director는 내부적으로  builder를 갖고 이를 처리한다. 중요한 점은 Director가 다양하게 구현된 builder를 갖을 수 있어서 동일한 Main클래스에서 builder만 다르게 세팅해줌으로 다양한 결과를 얻을 수 있다.

이 글을 공유하기

댓글

Email by JB FACTORY