어느 덧 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)
2020/06/09 - [Java] - [Design Pattern] 어댑터 패턴(Adapter Pattern)
2020/06/11 - [Java] - [Design Pattern] 템플릿 메소드 패턴(Template Method Pattern)
2020/06/13 - [Java] - [Design Pattern] 팩토리 메소드 패턴(Factory Method Pattern)
2020/06/14 - [Java] - [Design Pattern] 싱글톤(Singleton) 패턴과 프로토타입(Prototype) 패턴
그럼 이만-_-
'Java' 카테고리의 다른 글
[Design Pattern] 브릿지 패턴(Bridge Pattern) (0) | 2020.06.23 |
---|---|
[Design Pattern] 추상적인 공장 패턴(Abstract Factory Pattern) (0) | 2020.06.21 |
[Design Pattern] 싱글톤(Singleton) 패턴과 프로토타입(Prototype) 패턴 (0) | 2020.06.14 |
[Design Pattern] 팩토리 메소드 패턴(Factory Method Pattern) (0) | 2020.06.13 |
[Design Pattern] 템플릿 메소드 패턴(Template Method Pattern) (0) | 2020.06.11 |