본문 바로가기

Coding Note

[Design pattern] Builder

Builder Pattern : 객체가 생성되는데 복잡한 과정이 필요하다면, 객체가 생성되는 과정이 특별하게 다루어져야한다. 이런 과정이 클라이언트에서 이루어진다면, 클라이언트의 사용실수는 잘못된 객체의 생성으로 이루어질 수 있다. 이런 문제를 막기위해 복잡한 객체의 생성을 Builder라 하는 클래스에게 임명하여 클라이언트로부터 객체의 생성과정을 보호하여 정상적인 객체만 생성되도록 한다.

 

 

객체의 생성과정을 숨겨 완성품만 받아보겠다는 부분은 Factory pattern과 같다. 다만 다른점은 Builder pattern은 하나의 클래스에 대한 인스턴스화를 담당하는 부분이라기 보다는 여러 인스턴스로 하나의 복합적인 객체를 조합해주는 작업을 한다는것이다. 직접적인 조립작업을 담당하는 클래스가 Director이며 각 부품의 제조과정을 구체화 하는 클래스는 ConcreteBuilder이다. Builder는 제조과정의 인터페이스를 제공한다.


대기업이 있고 SI회사가 있다면, Factory 는 SI회사이며 하나의 부품을 생성하고 Builder인 대기업에서 하나의 완성된 제품으로 조립해준다고 보면 적절하다.

 

Builder를 만들때는 파생되는 ConcreteBuilder가 Builder의 함수만을 구현하기때문에 필요한 일반화되는 클래스에서 사용할 기능의 인터페이스를 자세히 두어야한다. Director는 Builder에서 제공하는 인터페이스를 통하여 원하는 형태의 제품을 만들기만 하면 되고, 그 구현은 알 필요 없다. 마찬가지로 클라이언트는 Director가 완성시킨 제품을 ConcreteBuilder로부터 받아오기만 하면 된다.

 

로봇을 제작하는 과정을 통해 예를들어보자. 로봇에는 많은 부품들이 있고, 이런 부품들을 조립하여 하나의 제품을 만든다. 하지만 잘못된 순서 혹은 빼먹은 부품이 생긴다면 로봇으로써의 기능을 제대로 하지 못하게 되므로 Builder가 제공하는 인터페이스로 Director를 통해 완성된 제품만을 클라이언트에게 노출시킬 필요가 있다.

 

public abstract class RobotBuilder{

public abstract void buildBody();

public abstract void buildBrainChip();

public abstract void buildWeapon();

}

 

public class TankRobotBuilder extends RobotBuilder{

private Robot robot;

 

public TankBuilder(){

robot = new TankRobot();

}

 

public void buildBody(){

robot.setBody( );

}

 

public void buildBrainChip(){

robot.setBrainChip( new LowIntelligenceBrainChip() );

}

 

public void buildWeapon(){

robot.setMainWeapon( new TowerCannon(100.0f) );

robot.setSubWeapon( new HeavyMachinGun(25.0f) );

}

 

public Robot getResult(){ return robot; }

}

 

public class RobotDirector{

public void construct(RobotBuilder builder){

builder.buildBody();

builder.buildBrainChip();

builder.buildWeapon();

}

}

 

public static void main(String args[]){

RobotDirector robotDirector = new RobotDirector();

TankRobotBuilder tankRobotBuilder = new TankRobotBuilder();

 

robotDirector.construct(tankRobotBuilder);

 

Robot product = tankRobotBuilder.getResult();

}

 

클라이언트는 제품이 어떤 부품이 어떤 순서로 제작되는지는 몰라도 된다. 정비사가 잘 만들어서 완성된 제품만 받아보면 되는것이다.

 

한줄요약 : 부품을 만드는 과정도 중요하지만, 부품으로 완성품을 조립하는 과정 또한 중요하다.

'Coding Note' 카테고리의 다른 글

[Design pattern] Chain of Responsibliity  (1) 2013.02.02
[Design pattern] Prototype  (1) 2013.02.01
[Design pattern] Singleton  (0) 2013.01.31
[Design pattern] Factory Method  (0) 2013.01.30
[Design pattern] Abstract Factory  (0) 2013.01.27