카테고리 없음

본캠프_TIL_52일차(싱글톤 패턴)

티-히히 2024. 11. 26. 23:47

오늘 한 일 (회고)

  • 오전
    • 기획회의
      • 기능 구현 논의
      • 역할 배정
  • 오후
    • 스탠다드11 프레임워크 특강듣기
  • 저녁
    • UIManager작성
    • StartScreen 프리팹생성

새로 배운 것

 

싱글톤 패턴

개별 싱글톤 패턴과 중재자 패턴

 

제네릭 싱글톤 패턴

public class MonoSingletone<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T _instance;
    public static T Instance
    {
        get
        {
            if (_instance != null)
                return _instance;

            _instance = FindObjectOfType<T>();

            if (_instance == null)
            {
                GameObject go = new GameObject(typeof(T).Name);
                _instance = go.AddComponent<T>();
            }
            return _instance;
        }
    }

    protected virtual void Awake()
    {
        if (_instance == null)
        {
            _instance = this as T;
        }
        else if (_instance != this)
        {
            Destroy(gameObject);
        }
    }
}

 

이 클래스는 특정 MonoBehaviour 타입의 싱글톤 객체를 보장하는 역할을 합니다.

 

개별 싱글톤 패턴

public class GameManager : MonoSingletone<GameManager>
{
    private void Start()
    {
        Debug.Log("게임매니저 셋팅완료");
    }
}
public class DataManager : MonoSingletone<DataManager>
{
    private void Start()
    {
        Debug.Log("DataManager 셋팅완료");
    }
}
public class ResourceManager : MonoSingletone<ResourceManager>
{
    private void Start()
    {
        Debug.Log("ResourceManager 셋팅완료");
    }
}
public class SoundManager : MonoSingletone<SoundManager>
{
    private void Start()
    {
        Debug.Log("SoundManager 셋팅완료");
    }
}
public class UIManager : MonoSingletone<UIManager>
{
    private void Start()
    {
        Debug.Log("UIManager 셋팅완료");
    }
}

 

 

각각의 매니저들이 모노비헤이비어를 상속받습니다.

각각의 인스턴스를 받을 수 있습니다.

 

중재자 패턴

public class GameManager2 : MonoSingletone<GameManager2>
{
    UIManager2 uiManager = new();
    DataManager2 dataManager = new DataManager2();
    SoundManager2 soundManager = new SoundManager2();
    ResourceManager2 resourceManager = new ResourceManager2();

    private void Start()
    {
        uiManager.Init();
        dataManager.Init();
        soundManager.Init();
        resourceManager.Init();
        Debug.Log("게임매니저2 셋팅완료");
    }
}

 

interface IManager
{
    void Init();
    void Release();
}
public class DataManager2 : IManager
{
    public void Init()//초기화
    { 
        
    }

    public void Release()//해제
    {
        throw new System.NotImplementedException();
    }
}
public class ResourceManager2 : IManager
{
    public void Init()
    {
        throw new System.NotImplementedException();
    }

    public void Release()
    {
        throw new System.NotImplementedException();
    }
}

 

.

.

 

게임매니저만 싱글톤 패턴을 사용하여 게임의 주요 매니저 클래스들을 초기화하는 역할을 하고 있습니다.

Start메서드가 호출되면 Init메서드를 통해 각 매니저들이 초기화 됩니다.

 

 

각 매니저가 싱글톤 패턴을 사용할 때

  • 모든 매니저가 자체적으로 싱글톤을 관리하며, 독립적인 인스턴스를 보장.
  • 클래스 간 의존성을 최소화하여, 각 매니저가 서로 독립적으로 동작.
  • 의존성 관리:
    • 각 매니저를 필요로 하는 곳에서 직접 싱글톤 인스턴스에 접근.
    • 예: UIManager.Instance.DoSomething();

 게임 매니저가 중재자 역할을 할 때

  • 게임 매니저가 모든 매니저의 인스턴스를 생성하고 초기화, 관리.
  • 다른 클래스는 게임 매니저를 통해 매니저에 접근.
    • 예: GameManager.Instance.UIManager.DoSomething();