빌더 패턴(Builder Pattern)이란?
빌더 패턴(Builder Pattern)은 객체를 생성할 때 주로 사용되는 패턴이다. 어떠한 객체를 생성하고자 할 때, 객체 생성에 필요한 요소들은 Builder에 주입하고 Builder가 해당 요소를 바탕으로 객체를 생성하는 방식이다. 우리가 개발할 때 주로 사용되는 StringBuilder가 대표적인 예이다.
내용
일반적으로 객체를 생성할 때, 생성자를 이용하여 객체를 생성한다. 하지만 객체 내부 요소에 대한 접근이 어렵다면? 객체 생성시 입력된 요소에 따라 다른 의미의 객체가 생성되어야 한다면? 필요한 요소에 따라 생성자가 계속 overload 되어야 할 것이다. 이러한 문제를 빌더 패턴을 통해 해소할 수 있다.
빌더패턴을 이용하여 객체를 생성하면 아래와 같은 문제를 해소할 수 있다.
- 생성자의 단순화 및 코드 간결성 확보
- 객체를 수정하지 않고 요소별 생성 가능 (객체의 불변성 확보)
빌더 패턴를 구현할 때 가장 중요한 점은 Builder가 객체 생성의 과정을 책임지고 생성을 진행한다는 것이다.
예제
Player
아래와 같이 Player라는 객체가 존재한다고 하자. Player는 운동선수를 나타내는 객체이며 이름과 나이, 왼발잡이인지 오른발잡이인지에 대한 정보와 왼손잡이 오른손잡이인지를 나타내는 정보를 가지고 있다. Introduce 함수를 통해 자신의 소개를 할 수 있다.
public class Player
{
string Name { get; set;}
public int Age { get; set;}
public eLeftRight? Foot { get; set; }
public eLeftRight? Hand { get; set; }
public void Introduce()
{
var job = Foot != null ? "Soccer Player" : "Baseball Player";
Console.WriteLine(
$"Name : {Name}, \n" +
$"Age : {Age}, \n" +
$"Job : {Job} \n");
}
}
PlayerBuilder
Player 객체를 생성하기 위한 PlayerBuilder는 다음과 같다. Foot, Hand 정보에 따라 해당 객체의 정보가 축구선수인지 야구 선수인지를 구분한다.
public class PlayerBuilder
{
public string Name { get; set; }
public int Age { get; set; }
public eLeftRight? Foot { get; set; }
public eLeftRight? Hand { get; set; }
public Player Build()
{
var player = new Player()
{
Name = this.Name,
Age = this.Age,
};
// Soccer Player
if(Foot != null)
player.Foot = this.Foot;
// Baseball Player
else if(Hand != null)
player.Hand = this.Hand;
return player;
}
}
사용
Builder를 사용할 때는 아래와 같이 사용한다. builder에 객체를 생성하기 위한 정보를 입력하고 Build() 함수를 실행하면 정보를 Builder가 판단하여 유의미한 객체를 생성 및 반환한다.
var builder = new PlayerBuilder();
builder.Name = "Park";
builder.Age = 20;
builder.Foot = eLeftRight.Right;
var player = builder.Build();
player.Introduce();
// Result
/*
Name : Park,
Age : 20,
Job : Soccer Player
*/
'Software Develop > Design Pattern' 카테고리의 다른 글
스테이트 패턴 (State Pattern) (0) | 2023.01.16 |
---|---|
싱글톤 패턴 (Singleton Pattern) (0) | 2023.01.16 |
파사드 패턴 (Facade Pattern) (0) | 2023.01.12 |
Inversion Of Control Container, IUnityContainer (0) | 2022.02.24 |
MVVM 패턴 (Model - View - ViewModel) (0) | 2022.02.24 |