DevDino

[게임 디자인 패턴] 추상 팩토리 패턴(Abstract Factory Pattern) 본문

Unity/디자인 패턴

[게임 디자인 패턴] 추상 팩토리 패턴(Abstract Factory Pattern)

데브다이노 2026. 7. 14. 14:51

Abstract Factory Pattern

게임을 개발하다 보면 서로 다른 종류의 객체들이지만, 특정한 시스템(또는 테마) 아래에서 함께 작동해야 하는 경우가 많습니다.

예를 들어 'PC용 버튼/슬라이더 세트'와 '모바일용 버튼/슬라이더' 세트를 상황에 따라 갈아 끼워야 한다면 어떨까요?

 

객체를 생성할 때마다 조건문으로 플랫폼을 확인하면 코드가 매우 지저분해집니다. 이를 해결하고, 관련된 객체들을 부품 세트처럼 통째로 생산할 수 있게 해주는 추상 팩토리 패턴에 대해 알아보겠습니다. 

 

추상 팩토리 패턴(Abstract Factory Pattern)이란? 

서로 관련이 있거나 의존적인 객체들의 조합(Family)을 생성하기 위한 인터페이스를 제공하는 디자인 패턴입니다. 구체적인 클래스를 지정하지 않고도, 일관성 있는 객체 세트를 생성할 수 있도록 캡슐화합니다. 

 

추상 팩토리 패턴의 장점

- 일관성 보장: 생성되는 객체들이 항상 올바른 조합으로 묶이도록 강제합니다. 

- 결합도 감소: 클라이언트는 인터페이스만 알면 되므로, 구체적인 구현체와 완전히 분리됩니다. 

- 확장성: 새로운 제품군을 추가해도 기존 코드를 수정할 필요가 없습니다. 

 

구현 예제

1. 인터페이스 및 구현체 정의하기

생성될 객체들의 추상적인 규칙을 정의합니다. 

// 제품군 1: 버튼
public interface IButton { void Render(); }
public class PCButton : IButton { public void Render() => Debug.Log("PC 스타일 버튼 출력"); }
public class MobileButton : IButton { public void Render() => Debug.Log("모바일 스타일 버튼 출력"); }

// 제품군 2: 슬라이더
public interface ISlider { void Render(); }
public class PCSlider : ISlider { public void Render() => Debug.Log("PC 스타일 슬라이더 출력"); }
public class MobileSlider : ISlider { public void Render() => Debug.Log("모바일 스타일 슬라이더 출력"); }

 

2. 추상 팩토리 및 구체적인 팩토리 정의하기

관련 객체들을 세트로 묶어서 생산하는 공장들을 정의합니다.

public interface IUIFactory
{
    IButton CreateButton();
    ISlider CreateSlider();
}

public class PCUIFactory : IUIFactory
{
    public IButton CreateButton() => new PCButton();
    public ISlider CreateSlider() => new PCSlider();
}

public class MobileUIFactory : IUIFactory
{
    public IButton CreateButton() => new MobileButton();
    public ISlider CreateSlider() => new MobileSlider();
}


3. 클라이언트(사용자) 만들기

클라이언트는 어떤 공장(Factory)이 들어오는지 상관하지 않고, 인터페이스를 통해 객체를 얻어 사용합니다. 

public class UIManager : MonoBehaviour
{
    private IUIFactory uiFactory;

    public void SetFactory(IUIFactory factory) => uiFactory = factory;

    public void GenerateUI()
    {
        if (uiFactory == null) return;

        IButton btn = uiFactory.CreateButton();
        ISlider sld = uiFactory.CreateSlider();

        btn.Render();
        sld.Render();
    }
}

 

 

단일 팩토리가 '객체 하나'를 만드는 데 집중했다면, 추상 팩토리는 '객체들의 관계'를 일관성 있게 관리합니다. 

UI나 테마 시스템처럼 연관된 데이터가 세트로 움직여야 하는 상황에서 코드의 결합도를 낮추고, 확장성 높은 구조를 설계할 수 있게 도와줍니다.