Builder
빌더 패턴은 복잡한 객체의 생성 과정을 단계별로 캡슐화한다
같은 생성 과정으로 서로 다른 표현의 객체를 만들 수 있게 해주는 생성 ( Creational ) 패턴이다.
조립 과정을 분리해서 유연하게 객체를 생성하는 것이 핵심이다.
▼예시 코드
using UnityEngine;
public class Ship : MonoBehaviour
{
public string ShipName;
public string Hull;
public string Engine;
public string Weapon;
public void ShowInfo()
{
Debug.Log($"배 이름: {ShipName}, 선체: {Hull}, 엔진: {Engine}, 무기: {Weapon}");
}
}
public class ShipBuilder
{
private GameObject shipObject;
private Ship ship;
public ShipBuilder(GameObject shipPrefab, Vector3 position)
{
shipObject = Object.Instantiate(shipPrefab, position, Quaternion.identity);
ship = shipObject.GetComponent<Ship>();
}
public ShipBuilder SetName(string name)
{
ship.ShipName = name;
return this;
}
public ShipBuilder SetHull(string hull)
{
ship.Hull = hull;
return this;
}
public ShipBuilder SetEngine(string engine)
{
ship.Engine = engine;
return this;
}
public ShipBuilder SetWeapon(string weapon)
{
ship.Weapon = weapon;
return this;
}
public Ship Build() {
return ship;
}
}
// Product
public class Computer
{
public string CPU { get; set; }
public string GPU { get; set; }
public string RAM { get; set; }
public override string ToString() => $"CPU: {CPU}, GPU: {GPU}, RAM: {RAM}";
}
// Builder 인터페이스
public interface IComputerBuilder
{
void SetCPU();
void SetGPU();
void SetRAM();
Computer GetResult();
}
// ConcreteBuilder
public class GamingComputerBuilder : IComputerBuilder
{
private Computer _computer = new Computer();
public void SetCPU() => _computer.CPU = "i9";
public void SetGPU() => _computer.GPU = "RTX 4090";
public void SetRAM() => _computer.RAM = "32GB";
public Computer GetResult() => _computer;
}
public class OfficeComputerBuilder : IComputerBuilder
{
private Computer _computer = new Computer();
public void SetCPU() => _computer.CPU = "i5";
public void SetGPU() => _computer.GPU = "Integrated";
public void SetRAM() => _computer.RAM = "16GB";
public Computer GetResult() => _computer;
}
// Director
public class ComputerDirector
{
public Computer Construct(IComputerBuilder builder)
{
builder.SetCPU();
builder.SetGPU();
builder.SetRAM();
return builder.GetResult();
}
}
// Client
class Program
{
static void Main()
{
var director = new ComputerDirector();
var gamingBuilder = new GamingComputerBuilder();
var gamingPC = director.Construct(gamingBuilder);
Console.WriteLine(gamingPC); // CPU: i9, GPU: RTX 4090, RAM: 32GB
var officeBuilder = new OfficeComputerBuilder();
var officePC = director.Construct(officeBuilder);
Console.WriteLine(officePC); // CPU: i5, GPU: Integrated, RAM: 16GB
}
}
주의할 점
- Product 구조가 단순하다면 오히려 코드가 불필요하게 복잡해질 수 있다.
- Builder 클래스가 많아지면 관리 비용이 커진다.
- Director 없이도 Builder 만으로 구현 가능하지만, 일관된 생성 절차가 필요하다면 Director를 두는 것이 좋다.
사용하면 좋은 상황
객체 생성이 단계적으로 진행되어야 할 때 ( 예시 : 게임 캐릭터 생성 , 복잡한 UI 구성 )
동일한 생성 절차로 서로 다른 표현의 객체를 만들어야 할 때
생성 과정이 자주 바뀌지만 , 최종 결과물의 구조는 안정적일 때
정리
복잡한 객체 생성을 단계별로 분리하여, 동일한 절차로 다양한 객체를 유연하게 생성할 수 있게 해주는 패턴이다.
'⭐C Sharp > 13. 디자인 패턴' 카테고리의 다른 글
| Factory Method (0) | 2025.09.30 |
|---|---|
| 의존성 주입 ( Dependency Injection ) (0) | 2025.09.29 |
| Gang of Four (0) | 2025.09.29 |
| 게임에 자주 쓰이는 패턴 (0) | 2025.09.29 |
| 디자인 패턴 ( Design Pattern ) (0) | 2025.09.29 |