Java

[Design Pattern] 빌더 패턴(Builder Pattern)

구루싸 2020. 6. 15. 22:29
반응형
SMALL

어느 덧 6월도 중순이 되었습니다

시간이 무섭도록 빠르다고 느껴지는데요

시간이 더 흐르기 전에

하나라도 더 학습해야겠습니다

지난 시간에 이어 디자인 패턴 중

빌더 패턴(Builder Pattern)에 대해 학습하겠습니다

빌더 패턴은 구조를 가진 인스턴스를

쌓아 올린다는 의미인데요

아래는 빌더 패턴을 구성하는

역할들을 정리한 것입니다

역할 설명
건축가(Builder) 인스턴스를 생성하기 위한 인터페이스를 결정
구체적인 건축가(Concrete Builder) Builder 역할의 인터페이스를 구현
감독자(Director) Builder 역할의 인터페이스를 사용해서 인스턴스를 생성
의뢰인(Client) Builder 패턴을 이용하는 역할

매번 하는 소리지만

글만으로 느낌을 알 수 없네요-_-

그럼 역시 구현을 해봐야겠죠?

1. 추상 클래스(Abstract class) Builder.java

package builderPattern;

public abstract class Builder {
	public abstract void makeTitle(String title);
	public abstract void makeString(String string);
	public abstract void makeItems(String[] items);
	public abstract void close();
}

2. 클래스(Class) Director.java

package builderPattern;

public class Director {
	private Builder builder;
	public Director(Builder builder) {
		this.builder = builder;
	}
	public void constructor() {
		builder.makeTitle("Greeting");
		builder.makeString("in the morning and night");
		builder.makeItems(new String[] {
			"Good morning",
			"Hi"
		});
		builder.makeString("at the night");
		builder.makeItems(new String[] {
				"Hi",
				"Good night",
				"Good bye"
		});
		builder.close();
	}
}

3. 클래스(Class)  TextBuilder.java

package builderPattern;

public class TextBuilder extends Builder {
	private StringBuffer buffer = new StringBuffer();
	public void makeTitle(String title) {
		buffer.append("==================================\n");
		buffer.append("<" + title + ">\n");
		buffer.append("\n");
	}
	public void makeString(String string) {
		buffer.append('■' + string + "\n");
		buffer.append("\n");
	}
	public void makeItems(String[] items) {
		for ( int i = 0; i < items.length; ++i ) {
			buffer.append("\t●" + items[i] + "\n" );
			buffer.append("\n");
		}
	}
	public void close() {
		buffer.append("==================================\n");
	}
	public String getResult() {
		return buffer.toString();
	}
}

4. 클래스(Class) HTMLBuilder.java

package builderPattern;

import java.io.*;

public class HTMLBuilder extends Builder {
	private String filename;
	private PrintWriter writer;
	public void makeTitle(String title) {
		filename = title + ".html";
		try {
			writer = new PrintWriter(new FileWriter(filename));
			writer.println("<html><head><title>" + title + "</title></head><body>");
			writer.println("<h1>" + title + "</h1>");
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	public void makeString(String string) {
		writer.println("<p>" + string + "</p>");
	}
	public void makeItems(String[] items) {
		writer.println("<ul>");
		for ( int i = 0; i < items.length; ++i ) {
			writer.println("<li>" + items[i] + "</li>");
		}
		writer.println("</ul>");
	}
	public void close() {
		writer.println("</body></html>");
		writer.close();
	}
	public String getResult() {
		return filename;
	}
}

5. 클래스(Class) Text.java

import builderPattern.*;
public class Test {
	public static void main(String[] args) {
		/* Builder Pattern */
		TextBuilder textBuilder = new TextBuilder();
		Director director = new Director(textBuilder);
		director.constructor();
		System.out.println(textBuilder.getResult());
		
		HTMLBuilder htmlBuilder = new HTMLBuilder();
		director = new Director(htmlBuilder);
		director.constructor();
		System.out.println("Written " + htmlBuilder.getResult());
	}
}

위의 코드에서

TextBuilder와 HTMLBuilder 클래스는

Builder 클래스의 하위 클래스이고

Director 클래스는 Builder 클래스의

메소드만을 사용해서 문서를 작성합니다

그래서 Director 클래스는

실제로 동작하는 것이 TextBuilder 인지

HTMLBuilder 인지를 모르고

바로 이점 때문에 교체를 가능하게 합니다

오늘의 학습은 이것으로 마치고

다음 학습은 추상적인 공장 패턴입니다

이 패턴은 추상적인 부품을 조합해서

추상적인 제품을 만드는 것으로

구체적인 구현이 아닌

인터페이스에 주목하는 패턴입니다

다음에 구현 해보도록하겠습니다

지금까지 학습한 패턴들이 궁금하시다면

아래의 링크↓

2020/06/08 - [Java] - [Design Pattern] 반복자 패턴(Iterator Pattern)

 

[Design Pattern] 반복자 패턴(Iterator Pattern)

아직 6월 초인데 한 여름 마냥 날씨가 급격하게 더워져서 출퇴근 길에 땀이 흥건...하... 30도 가까이 되는 지역도 있더라고요 코로나19도 끝날 기미가 보이지 않는데 몸 관리 잘하시길 바랍니다 ��

yssa.tistory.com

2020/06/09 - [Java] - [Design Pattern] 어댑터 패턴(Adapter Pattern)

 

[Design Pattern] 어댑터 패턴(Adapter Pattern)

오늘 하루도 끝나가네요-_- 시간은 왜 이리도 빠른지 도전해 보고 싶은 것은 많은데 나이만 먹는거 같네요ㅜㅜ 아무튼 오늘은 지난 시간에 이어서 디자인 패턴 중 어댑터 패턴에 대해 학습하겠��

yssa.tistory.com

2020/06/11 - [Java] - [Design Pattern] 템플릿 메소드 패턴(Template Method Pattern)

 

[Design Pattern] 템플릿 메소드 패턴(Template Method Pattern)

오늘 하루도 어느덧 저물어 가네요 날씨가 더워져서 코로나19로 인한 마스크 착용이 더욱 괴롭게 느껴집니다 하루 빨리 코로나19에 대한 백신이 개발되어 안정되기 바랍니다 아무튼 오늘도 디자

yssa.tistory.com

2020/06/13 - [Java] - [Design Pattern] 팩토리 메소드 패턴(Factory Method Pattern)

 

[Design Pattern] 팩토리 메소드 패턴(Factory Method Pattern)

지난 학습에서 Template Method 패턴이 상위 클래스에서 처리 골격을 만들고 하위 클래스에서 구체적인 처리를 하는 것을 확인하였는데 오늘의 학습 주제인 Factory Method Pattern은 인스턴스를 생성하는

yssa.tistory.com

2020/06/14 - [Java] - [Design Pattern] 싱글톤(Singleton) 패턴과 프로토타입(Prototype) 패턴

 

[Design Pattern] 싱글톤(Singleton) 패턴과 프로토타입(Prototype) 패턴

어느 덧 한 주를 마무리하는 일요일이 되었습니다 내일이 되면 다시 한주를 바쁘게 살아가야한다는... 아무튼 오늘은 지정한 클래스의 인스턴스가 한 개만 존재하는 것을 보증하고 싶을 때 사용

yssa.tistory.com

그럼 이만-_-

반응형
LIST