C++에서 builder pattern SW

C++에서 개인적으로 거의 사용하지 않은 pattern 중에서 android를 보니 builder pattern (아마 GoF의 builder랑은 다른 것으로 기억합니다) 이 많이 사용되고 있습니다. 예를 들어 http://developer.android.com/reference/android/app/Notification.Builder.html 를 보면 별도의 Builder class를 정의합니다.


이 때의 장점은 argument가 아주 많은 생성자가 필요 한 경우 overloading 이 아주 많이 필요 한 경우를 간단하게 구현 할 수 있습니다. builder를 사용하지 않으면 이 경우

  1. 모든 경우를 overloading
  2. dummy 생성자를 제공하고 모든 경우에 대한 setter를 제공

이 가능한데, 2번의 경우 setter를 완료하기 전에 객체를 잘못 사용하는 것을 막을 수 없습니다. Builder class를 제공하면 이러한 문제를 해결합니다.


Java의 builder는 inner class에 의존적이라 C++에서 사용 가능 할 까 생각 해 보았는데, 별로 어렵지 않더군요.

class TestRequest {
public:
~TestRequest() {}

public:
class Builder {
public:
Builder(void) : value1(0), value2(0) {}

~Builder(void) {}

Builder& setValue1(int val1) { value1 = val1; return *this; }

Builder& setValue2(int val2) { value2 = val2; return *this; }

TestRequest* build(void) { return new TestRequest(*this); }

private:
int value1;
int value2;

friend class TestRequest;
};

private:
TestRequest();

TestRequest(Builder& builder) : value1(builder.value1), value2(builder.value2) {}

private:
int value1;
int value2;
};

다음과 같이 사용합니다.

TestRequest::Builder build;
TestRequest* pReq = build.setValue1(2).setValue2(3).build();


훨씬 깔끔하긴 하네요. 다만 객체가 항상 heap에 할당되고 stack에는 할당되지 못하는 문제가 있어서 java와는 상황이 다르군요.