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
'공부 > 디자인패턴' 카테고리의 다른 글
Bridge Pattern (브릿지 패턴) (0) | 2023.03.24 |
---|---|
Singleton Pattern (싱글톤 패턴) (0) | 2023.02.03 |
디자인 패턴 (0) | 2023.02.03 |
Factory Method Pattern (팩토리 메소드 패턴) (0) | 2023.02.02 |
Abstract Factory Pattern (추상 팩토리 패턴) (0) | 2023.02.02 |