빌더 (Builder) 패턴 생성 패턴
많은 매개변수를 필요로 하는 객체의 생성을 단계적으로 진행합니다.
보통 객체를 생성할 때에는, 생성자를 통해 매개 변수를 객체에게 넘겨 초기 설정을 하도록 지시를 한다. 이것은 확실한 객체의 초기 설정을 보장한다. 그러나, 생성자를 통해 전달해야 할 매개 변수가 다양할 경우에는 클라이언트가 생성자에게 전달해야 할 매개 변수의 의도를 파악하기 어려워지고, 전달하고 싶지 않은 매개 변수조차 모두 전달해야 하는 상황이 발생한다. (이에 대한 해결책으로 다양한 언어에서는 디폴트 매개 변수를 지원하지만, 이마저도 한계가 있다.)
그래서 빌더 패턴은 생성자를 통해 객체를 직접 생성하는 대신에, 빌더 객체가 객체의 생성을 대신 수행하게 된다. 그리고, 클라이언트가 빌더 객체의 인터페이스를 통해 변수를 객체에게 차례로 전달하여 (객체를 건설=Build 하는 모습으로 표현된다) 객체의 초기 설정을 진행하며, 최종적으로 완성된 객체를 빌더 객체로부터 전달 받을 수 있다.
빌더 패턴을 이용해 다른 방법으로 객체를 생성하게 되면, 객체의 생성에 대한 기능을 캡슐화할 수 있고, 클라이언트가 원하는 매개변수만 객체에 차례로 입력할 수 있게 된다. 하지만, 객체를 생성하기 위해 변형 가능한 빌더 클래스를 정의해야 하고, 빌더 패턴을 통해 생성된 객체는 무결성이 보장되지 않는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | public class PatternBuilder { public interface IBuilder { ISubject subject { get; } IBuilder BuildSubject(); IBuilder SetName(string name); } public class Builder : IBuilder { private ISubject _subject; public ISubject subject { get { return _subject; } } public IBuilder BuildSubject() { _subject = new Subject(); return this; } public IBuilder SetName(string name) { _subject.SetName(name); return this; } } public interface ISubject { void SetName(string name); void Operation(); } public class Subject : ISubject { private string _name; public void Operation() { Console.WriteLine("Operating " + _name); } public void SetName(string name) { _name = name; } } public static void Main(string[] args) { IBuilder builder = new Builder(); builder.BuildSubject() .SetName("SubjectA"); ISubject subject = builder.subject; subject.Operation(); } } | cs |
1 2 | Operating SubjectA Press any key to continue . . . | cs |
Builder 객체를 이용하여 Subject 객체를 생성하고, Builder 객체의 SetName(string)을 호출하여 Subject 객체에게 name 매개 변수를 전달하여 초기 설정을 수행하였다.
'PROGRAMMING > Design Pattern' 카테고리의 다른 글
[GoF] 프로토타입 (Prototype) 패턴 (0) | 2019.03.09 |
---|---|
[GoF] 팩토리 메서드 (Factory Method) 패턴 (0) | 2019.03.09 |
[GoF] 추상 팩토리 (Abstract Factory) 패턴 (0) | 2019.03.09 |
[GoF] 경량 (Flyweight) 패턴 (0) | 2019.03.09 |
[GoF] 파사드 (Facade) 패턴 (0) | 2019.03.09 |