1. 빌더 패턴이란?
- 객체를 생성할 때, 그 객체를 구성하는 부분 부분을 단계별로 먼저 생성하고, 이를 조합함으로써 객체 전체를 생성한다.
- 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴
- 생성자 오버로딩
- 복잡한 단계로 생성되는 생성자를 더 쉽고 가독성이 높게 생성할 수 있도록 고안된 패턴
- 편리함과 가독성에 중점을 두고 있어 성능상의 큰 차이는 없지만 작업능률에 큰 차이가 있을 수 있음.
2. 빌더 패턴을 사용하는 경우
- 오브젝트의 생성과정이 복잡할 때 이를 간단하게 만들기 위함
- 플레이어 캐릭터의 옷, 무기 등을 조합하고 장착하는 로직을 구현할 때 사용
3. 빌더 패턴의 장점
1) 편리함 : 객체를 생성하는 클래스에서 만들어 해당 클래스에서 인스턴스를 생성하므로 가독성이 좋고, 유지보수가 쉬움
2) 단순함 : 생성과정이 복잡한 인스턴스를 일관된 프로세스로 생성
3) 축소된 생성자 : 멤버 변수의 초기화와 검증을 각각의 멤버 변수별로 분리해서 작성하여 생성자의 크기가 비대해지는 것을 막는다.
4) 간결함 : 디렉터를 사용하여 인스턴스를 만드는 구체적인 과정을 디렉터로 숨기고 클라이언트 코드는 디렉터를 호출하여 코드가 간결해진다.
5) 확장성 : 서로 다른 빌더 구현체를 주입함으로써 동일한 프로세스에서 서로 다른 객체를 생성할 수 있다.
4. 빌더 패턴의 단점
1) 구체적인 인스턴스를 생성하기 전에 반드시 빌더를 생성해야 함.
2) 관리해야 할 클래스가 많아지고 구조가 복잡해질 수 있음.
5. 코드 구현
using System;
namespace StudyCSharp
{
public class Company
{
private string name;
private string field; // 분야
private string phoneNumber;
// 빌더 패턴을 사용하지 않은 경우
public Company(string name, string field, string phoneNumber)
{
if (!field.Equals("전자") && !field.Equals("금융") && !field.Equals("IT"))
{
Console.WriteLine("해당 분야가 없습니다.");
}
if (!phoneNumber.StartsWith("010"))
{
Console.WriteLine("잘못된 번호입니다.");
}
this.name = name;
this.field = field;
this.phoneNumber = phoneNumber;
}
// 빌더 패턴을 사용하는 경우
public Company(CompanyBuilder builder)
{
this.name = builder.name;
this.field = builder.field;
this.phoneNumber = builder.phoneNumber;
}
public void GetInfo()
{
Console.WriteLine("회사명 : " + this.name);
Console.WriteLine("사업 분야 : " + this.field);
Console.WriteLine("회사번호 : " + this.phoneNumber);
Console.WriteLine("---------------------------------");
}
}
// 빌더
public class CompanyBuilder
{
public string name;
public string field; // 분야
public string phoneNumber;
public CompanyBuilder() { }
public CompanyBuilder setName(string name)
{
this.name = name;
return this;
}
public CompanyBuilder setField(string field)
{
if (!field.Equals("전자") && !field.Equals("금융") && !field.Equals("IT"))
{
this.field = "해당 분야가 없습니다.";
}
else
{
this.field = field;
}
return this;
}
public CompanyBuilder setPhoneNumber(string phoneNum)
{
if (!phoneNum.StartsWith("010"))
{
this.phoneNumber = "잘못된 번호입니다.";
}
else
{
this.phoneNumber = phoneNum;
}
return this;
}
public Company GetCompany()
{
return new Company(this);
}
}
// 디렉터 - 빌더를 이용해 객체들을 생성(호출시 디렉터에서 일어나는 구체적인 과정들을 숨길 수 있음)
// 디렉터에서 회사 객체들을 만들어 냄
public class CompanyDirector
{
private CompanyBuilder companyBuilder;
public CompanyDirector()
{
companyBuilder = new CompanyBuilder();
}
public Company GetCompany()
{
return companyBuilder.GetCompany();
}
// 객체 생성 -> 객체 추가에 용이.
public CompanyBuilder AppleCompany()
{
// 메서드 체이닝 -> 생성자가 자기 자신을 리턴해서 가능
companyBuilder = companyBuilder.setName("Apple").setField("IT").setPhoneNumber("010-1111-2222");
return companyBuilder;
}
public CompanyBuilder KBCompany()
{
companyBuilder = companyBuilder.setName("국민은행").setField("금융").setPhoneNumber("010-9999-8888");
return companyBuilder;
}
public CompanyBuilder NoCompany()
{
companyBuilder = companyBuilder.setName("None").setField("none").setPhoneNumber("011-1111-2222");
return companyBuilder;
}
}
class Program
{
static void Main(string[] args)
{
// **빌더 패턴을 사용하지 않는 경우**
Company Company0 = new Company("삼성", "전자", "010-0000-0000");
Company0.GetInfo();
Console.WriteLine("---------------------------------");
// **빌더 패턴을 사용하는 경우**
CompanyDirector companyDirector = new CompanyDirector(); // 디렉터 생성
// 빌더를 이용해 클래스 객체 생성
Company Company1 = companyDirector.AppleCompany().GetCompany();
Company Company2 = companyDirector.KBCompany().GetCompany();
Company Company3 = companyDirector.NoCompany().GetCompany();
// 객체의 정보 출력
Company1.GetInfo();
Company2.GetInfo();
Company3.GetInfo();
// cf) 아래와 같이 한 번에 출력도 가능!
// companyDirector.AppleCompany().GetCompany().GetInfo();
}
}
}
<출력 결과>

<참고 사이트>
빌더 패턴 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 빌더 패턴이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다. 2 단어 요약 : 생성
ko.wikipedia.org
Chapter 10. 빌더 패턴(Builder Pattern)
인프런에 있는 이재환님의 강의 게임 디자인 패턴 with Unity 를 듣고 정리한 필기입니다. 😀
ansohxxn.github.io
[디자인패턴]01. 빌더패턴(builder pattern)
빌더 패턴 위키백과: https://ko.wikipedia.org/wiki/%EB%B9%8C%EB%8D%94_%ED%8C%A8%ED%84%B4 1. 빌더패턴 빌더패턴이란 복합객체의 생성과정과 표현방법을 분리하여 동일한 생성절차에서 서로 다른 표현 결과를 만
welcomeheesuk.tistory.com
[개발] 쉽게 배워 바로 써먹는 디자인 패턴 03 - 빌더(builder) 패턴, 프로토타입(Prototype) 패턴
Builder Pattern 오브젝트의 생성과정이 복잡할 때 이를 간단하게 만듦. 오브젝트의 생성 과정에 여러 인자가 필요할 때 이를 단순화 시킬 수 있음. 오브젝트의 생성과정이 복잡할 때 빌더 패턴으로
computer-art.tistory.com
[객체 생성 패턴] Chapter 4-4. Builder Pattern : 장단점
✍️ 빌더 패턴, 장점 빌더 패턴의 첫 번째 장점으로, 생성 과정이 복잡한 인스턴스를 일관된 프로세스로 생성할 수 있다. 동시에 클라이언트가 빌더의 메서드를 체이닝 형태로 호출하며 자연스
kangworld.tistory.com
C# - 디자인 패턴 - 빌더 패턴 (Builder Pattern)
1. 요약 빌더 패턴은 생성 패턴의 한 종류로 복잡한 단계로 생성되는 생성자를 더 쉽고 가독성이 높게 생성할 수 있도록 고안된 패턴입니다. 대부분의 디자인 패턴이 그러하듯 기본적인 개념을
math-development-geometry.tistory.com