본문 바로가기
공부/디자인패턴

Builder Pattern (빌더 패턴)

by 개발자5 2023. 3. 23.
Builder Pattern (빌더 패턴)

Builder Pattern은 객체 생성 시 복잡한 과정을 간소화 하기 위한 디자인 패턴 중 하나이다.

이 패턴은 객체의 생성과정을 단계별로 분리하고, 이 단계들을 수행하는 Builder 클래스를 만들어 객체를 생성한다.

 

따라서 Builder 패턴에서 객체를 생성하는 역할을 담당하는 Builder 클래스는 크게 두 가지 유형의 인터페이스를 가져야 하는데, 하나는 객체의 각 부분을 생성하기 위한 인터페이스이고, 다른 하나는 부분별로 생성된 것들을 조합해서 전체 객체를 구성한 뒤 이를 return 해주기 위한 인터페이스 이다.

 

 

Structure
  • Builder : Product을 생성하는 Abstract Interface 이다.
  • ConcreteBuilder : 구체 class로 Product을 생성하기 위해 부분(part)들을 구성하고 조립한다.

 

 

 

 

Example

아래는 고객이 원하는 형태의 자전거를 생산할 때 빌더 패턴을 사용한 예이다.

  • Client는 Director에게 별도의 Builder 객체를 전달하면서 시공을 위임한다. 이 때 전달되는 객체는 Builder (IBicycleBuilder)를 상속받는 구체 클래스인 ConcreteBuilder (GTBuilder)이다.
  • Director (MountainBikeBuildDirector)는 각 Part를 조립하여 고객이 원하는 Product (Bicycle)를 제공
/// <summary>
/// Represents a product created by the builder
/// </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>
/// The builder abstraction
/// </summary>
public interface IBicycleBuilder
{
    string Colour { get; set; }
    int Height { get; set; }

    Bicycle GetResult();
}

/// <summary>
/// Concrete builder implementation
/// </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>
/// The director
/// </summary>
public class MountainBikeBuildDirector
{
    private IBicycleBuilder _builder;
    public MountainBikeBuildDirector(IBicycleBuilder builder) 
    {
        _builder = builder;
    }

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

    public Bicycle GetResult()
	{
		return this._builder.GetResult();
	}
}

public class Client
{
    public void DoSomethingWithBicycles()
    {
        var director = new MountainBikeBuildDirector(new GTBuilder());
        // Director controls the stepwise creation of product and returns the result.
        Bicycle myMountainBike = director.Construct().GetResult();
    }
}

 

 

References