빌더 패턴(Builder Pattern)

빌더 패턴(Builder Pattern)

  • 빌더 패턴은 객체 생성을 보다 유연하게 하기 위한 방법 중 하나
  • 복잡한 기존 생성자를 별도로 실행한 뒤 조합
    • Builder 클래스를 이용해 각 파츠를 생성 후 조합
    • 클래스는 Builder에 객체에 object 생성을 맡기고, 직접 수행하지 않음
  • 한번에 모든 생성 데이터를 가질 수 없어 순차적으로 정보 수집 후 마지막에 생성자 호출을 할때 사용

장점

  • 하나의 클래스를 내부적으로 다양하게 디자인 가능
  • 생성 코드 캡슐화
  • 객체 생성 과정을 제어 가능

단점

  • 각 파츠마다 ConcreteBuilder를 디자인해야 함
  • 구조적으로 복잡한 dependency가 될 수 있음
/// <summary>
/// 빌더를 통해 생성되는 객체
/// </summary>
public class Bicycle
{
    public string Make { get; set; }
    public string Model { get; set; }
    public int Height { get; set; }
    public string Colour { get; set; }

    public Bicycle(string make, string model, string colour, int height)
    {
        Make = make;
        Model = model;
        Colour = colour;
        Height = height;
    }
}

/// <summary>
/// 추상 빌더
/// </summary>
public interface IBicycleBuilder
{
    string Colour { get; set; }
    int Height { get; set; }

    Bicycle GetResult();
}

/// <summary>
/// 실제 객체 생성 빌더
/// </summary>
public class GTBuilder : IBicycleBuilder
{
    public string Colour { get; set; }
    public int Height { get; set; }

    public Bicycle GetResult()
    {
        return Height == 29 ? new Bicycle("GT", "Avalanche", Colour, Height) : null;        
    }
}

/// <summary>
/// 객체 생성하는 Director
/// </summary>
public class MountainBikeBuildDirector
{
    private IBicycleBuilder _builder;
    public MountainBikeBuildDirector(IBicycleBuilder builder) 
    {
        _builder = builder;
    }

    public void Construct()
    {
        _builder.Colour = "Red";
        _builder.Height = 29;
    }
}

public class Client
{
    public void DoSomethingWithBicycles()
    {
        var builder = new GTBuilder(); // 빌더 생성
        var director = new MountainBikeBuildDirector(builder); // 디렉터에 빌더 할당

        director.Construct(); // 디렉터가 빌더에게 정보 전달
        Bicycle myMountainBike = builder.GetResult(); // 빌더가 최종 객체 생성
    }
}

출처