목차
빌더 패턴
빌더 패턴(Builder Pattern)은 복잡한 객체의 생성과정을 단계별로 분리하여 구현하는 방식을 말합니다.
이 패턴은 특히 객체의 구성이 복잡하거나 구성 과정에 여러 단계가 필요할 때 유용하게 사용됩니다.
빌더 패턴의 장,단점
장점
•
생성 과정의 재사용성 : 같은 생성 과정을 사용하여 다양한 표현을 생성할 수 있습니다.
•
코드의 가독성 향상 : 생성 과정을 단계별로 나누어 코드의 가독성을 향상시킵니다.
•
객체 생성 과정의 유연성 : 필요에 따라 객체 생성 과정을 더 유연하게 조절할 수 있습니다.
단점
•
구조의 복잡성 증가 : 추가 클래스와 인터페이스가 필요하므로 전체 구조가 복잡해질 수 있습니다.
•
성능 저하 : 간단한 객체에 대해 빌더 패턴을 사용할 경우, 필요 이상의 오버헤드가 발생할 수 있습니다.
빌더 패턴의 단점에 대한 구체적인 예시
간단한 게임 오브젝트를 생성하는 경우를 생각해 보겠습니다.
간단한 객체에 빌더 패턴을 적용하는 것은 과도한 복잡성을 초래할 수 있습니다.
간단한 객체 생성 예시 (빌더 패턴 적용 전)
using UnityEngine;
public class SimpleItem : MonoBehaviour
{
public string itemName;
public int itemID;
public Sprite itemIcon;
public SimpleItem(string name, int id, Sprite icon)
{
itemName = name;
itemID = id;
itemIcon = icon;
}
}
C#
복사
빌더 패턴 적용 후
public interface IItemBuilder
{
void BuildItemName(string name);
void BuildItemID(int id);
void BuildItemIcon(Sprite icon);
SimpleItem GetItem();
}
public class SimpleItemBuilder : IItemBuilder
{
private SimpleItem _item = new SimpleItem();
public void BuildItemName(string name)
{
_item.itemName = name;
}
public void BuildItemID(int id)
{
_item.itemID = id;
}
public void BuildItemIcon(Sprite icon)
{
_item.itemIcon = icon;
}
public SimpleItem GetItem()
{
return _item;
}
}
public class Director
{
public SimpleItem Construct(IItemBuilder builder, string name, int id, Sprite icon)
{
builder.BuildItemName(name);
builder.BuildItemID(id);
builder.BuildItemIcon(icon);
return builder.GetItem();
}
}
C#
복사
이 경우, SimpleItem 클래스의 인스턴스를 생성하기 위해 SimpleItemBuilder 클래스와 Director 클래스가 추가로 필요합니다. 이는 다음과 같은 문제점을 야기할 수 있습니다:
•
오버헤드 증가 : 간단한 객체의 생성을 위해 여러 단계와 클래스를 거치는 것은 불필요한 오버헤드를 발생시킵니다.
•
복잡성 증가 : 코드의 복잡성이 불필요하게 증가하며, 단순한 작업을 위해 더 많은 코드를 작성하고 관리해야 합니다.
•
유지 보수의 어려움 : 추가적인 클래스와 인터페이스는 유지 보수를 더 복잡하게 만듭니다.
빌더 패턴의 구조
1.
Builder (인터페이스 또는 추상 클래스) : 캐릭터의 각 부분을 구축하기 위한 메소드를 정의합니다.
2.
Concrete Builder : Builder 인터페이스를 구현하여 실제 캐릭터의 생성 로직을 담당합니다.
3.
Director : Builder를 사용하여 캐릭터를 순서대로 구축합니다.
4.
Product : 최종적으로 생성될 캐릭터 객체입니다.
빌더 패턴의 UML
아래는 빌더 패턴 UML입니다.
빌더 패턴의 구현
Builder 인터페이스
Builder 인터페이스는 생성할 객체의 각 부분을 구축하기 위한 메소드를 정의합니다.
이 인터페이스는 생성할 객체(Character)의 각 요소(예: 무기, 갑옷, 능력)를 구축하기 위한 메소드를 선언합니다.
public interface ICharacterBuilder
{
void BuildWeapon(string weaponType);
void BuildArmor(string armorType);
void BuildAbilities(string[] abilities);
Character GetResult();
}
C#
복사
Concrete Builder
Concrete Builder는 Builder 인터페이스를 구현하는 클래스입니다.
이 클래스는 실제 Character 객체의 생성 로직을 담당합니다. 여기서는 HeroBuilder가 Concrete Builder 역할을 합니다.
public class HeroBuilder : ICharacterBuilder
{
private Character character = new Character();
public void BuildWeapon(string weaponType)
{
character.Weapon = weaponType;
}
public void BuildArmor(string armorType)
{
character.Armor = armorType;
}
public void BuildAbilities(string[] abilities)
{
character.Abilities = abilities;
}
public Character GetResult()
{
return character;
}
}
C#
복사
Director
Director 클래스는 빌더를 사용하여 객체를 순서대로 구축하는 역할을 합니다.
Director는 특정 순서대로 빌더의 메소드를 호출하여 객체를 구축합니다. CharacterDirector가 이 역할을 담당합니다.
public class CharacterDirector
{
public Character Construct(ICharacterBuilder builder)
{
builder.BuildWeapon("Sword");
builder.BuildArmor("Chainmail");
builder.BuildAbilities(new string[] { "Attack", "Defend" });
return builder.GetResult();
}
}
C#
복사
Product
Product는 빌더 패턴을 통해 생성될 최종 객체입니다.
이 예시에서는 Character 클래스가 Product 역할을 합니다. Character 클래스는 다양한 속성과 메소드를 가질 수 있습니다.
public class Character
{
public string Weapon { get; set; }
public string Armor { get; set; }
public string[] Abilities { get; set; }
// Additional character methods...
}
C#
복사