- 개요 : 객체를 생성하되 그 객체를 구성하는 부분 부분을 먼저 생성(아래에서는 buildHead, buildBody, buildFoot)하고, 이를 조합함으로서 전체 객체를 생성하는 패턴
- 구조 예
- 소스
public abstract class ACharacterBuilder {
protected Character character = null;
abstract void buildHead();
abstract void buildBody();
abstract void buildFoot();
public void createNewCharacter() {
this.character = new Character();
}
public Character getResultCharacter() {
return this.character;
}
}
public class HumanBuilder extends ACharacterBuilder {
void buildBody() {
this.character.setBody("인간몸 생성");
}
void buildFoot() {
this.character.setFoot("인간발 생성");
}
void buildHead() {
this.character.setHead("인간머리 생성");
}
}
public class MonsterBuilder extends ACharacterBuilder {
void buildBody() {
this.character.setBody("괴물몸 생성");
}
void buildFoot() {
this.character.setFoot("괴물발 생성");
}
void buildHead() {
this.character.setHead("괴물머리 생성");
}
}
public class Character {
private String head = "";
private String body = "";
private String foot = "";
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public void show() {
System.out.println(getHead());
System.out.println(getBody());
System.out.println(getFoot());
}
}
public class Director {
public void construct(ACharacterBuilder chracterBuilder) {
chracterBuilder.createNewCharacter();
chracterBuilder.buildHead();
chracterBuilder.buildBody();
chracterBuilder.buildFoot();
}
}
public class Client {
public static void main(String[] args) {
ACharacterBuilder humanBuilder = new HumanBuilder();
ACharacterBuilder monsterBuilder = new MonsterBuilder();
Director director = new Director();
// 인간생성
System.out.println("===== 인간생성 시작 =====");
director.construct(humanBuilder);
Character humanA = humanBuilder.getResultCharacter();
humanA.show();
System.out.println("===== 괴물생성 시작 =====");
director.construct(monsterBuilder);
Character monsterA = monsterBuilder.getResultCharacter();
monsterA.show();
}
}
- 구현관리
- Character(Product)의 속성이 변경되면 ACharacterBuilder와 구현클래스들의 변경이 있게 되므로 Character(Product)의 속성에 대한 설계를 명확히 하는것이 중요하다. Character(Product)를 인덱서 형식으로 만들면 Character(Product) 클래스의 변경은 없을것 같다. (위의 예에서는 Character 에 map<string, string>을 가지고 있고 map을 추가하고 조회하는 메소드를 만들면 추후 Charater에 멤버를 추가 및 삭제할 때 Character class의 소스를 수정할 일이 없다.)
- Character(Product)가 여러개일 경우에는 ICharacter와 같이 추상화해서 사용해도 괜찮을것 같다.
- 참고