[Design Pattern] 1. 싱글톤 패턴(singleton)

업데이트:

카테고리:

태그: ,




싱글톤 패턴(singleton)

싱글톤 패턴(singleton)






1. 싱글톤 패턴 사용이유

image

이 패턴은 주로 객체 지향 프로그래밍에서 쓰인다.
싱글톤은 전역에서 접근이 가능하기에(Static) 원하는 스크립트에서 불러와서 마음대로 사용이 가능

public으로 매 스크립트마다 연결하는 것은 메모리의 사용이 스크립트의 수의 배수만큼 증가하지만,
싱글톤을 사용하면 한 메모리의 할당만으로 원하는 스크립트의 기능을 가져올 수 있기에 자주 쓰는 스크립트의 경우 메모리의 사용을 크게 줄일 수 있다.
접근의 편의메모리의 할당을 줄이기 위해 싱글톤 패턴을 사용

  • 특정 클래스의 인스턴스가 단 하나만 존재하도록 보장하는 디자인 패턴
  • 클래스의 인스턴스를 전역적으로 접근 가능
  • 게임의 설정, 오디오 매니저, UI 매니저 같이 전역적으로 하나만 존재








2. 싱글톤 패턴 사용법

싱글톤 AudioManager
public class AudioManager
{
    // 이 인스턴스는 프로그램의 실행 동안 단 한 번만 생성됨
    private static AudioManager _instance;

    // 싱글톤 인스턴스에 대한 접근자
    public static AudioManager Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new AudioManager();
            }
            return _instance;
        }
    }

    // 생성자를 private으로 설정하여 외부에서 인스턴스를 생성하는 것을 방지
    private AudioManager() 
    {
        // 초기화 코드
    }

    // 오디오 관련 메소드
    public void PlaySound(string soundName)
    {
        // 소리 재생
    }

    public void StopSound(string soundName)
    {
        // 소리 중지
    }
}

// 메모리 사용을 최적화하고 코드를 깔끔하게 사용할 수 있게 해주는 싱글톤 패턴!
AudioManager.Instance.PlaySound("backgroundMusic");








3. 장단점

장점

  • 메모리 낭비가 현저히 줄어든다는 것, (public)을 데려오는 경우 보다 싱글톤 패턴이 메모리를 절약
  • 싱글톤은 전역으로 접근이 가능하기에 가져올 필요 없이 어느 스크립트에서나 사용할 수 있다는 것
  • 공유 자원에 동시 접근을 제한하거나 사용할 수 있음.

단점

  • 유닛 테스트가 어려움
  • 잘못된 프로그래밍 습관을 유발함
  • 전역변수가 가지는 모든 단점을 그대로 갖게 된다.
  • 전역변수는 가장 마지막에 검색되게 때문에 조금 느릴 수 있으며, 유지보수가 조금 힘들어질 수 있다.








4. 12/22 추가

싱글톤 GameManager

public class GameManager : MonoBehaviour
{
    private static GameManager _instance;
    public static GameManager Instance
    {
        get
        {   // 다른 곳에서 GaneManager.Instance~~ 를 실행 했을때 NULL 이면(게임메니저가 없으면) GameManager을 생성, DondestroyOnload
            // Instance = 새로 생성된 게임 오브젝트의 GameManager.cs 의 PRIVATE _instance
            if(_instance == null)
            {
                GameObject go = new GameObject("GameManager");
                go.AddComponent<GameManager>();
                _instance = go.GetComponent<GameManager>();
                DontDestroyOnLoad(go);
            }
            return _instance;
        }
        set
        {
            if (_instance == null) _instance = value;
        }
    }
    private void Awake()
    {
        if(_instance == null)
        {
            _instance = this;
            DontDestroyOnLoad(this);
        }
        else
        {
            if (_instance != this) Destroy(this);
        }
    }   
}
  • Instance - get, set
  • 다른 곳에서 GaneManager.Instance~~ 를 실행 했을때 NULL 이면(게임메니저가 없으면) GameManager을 생성, DondestroyOnload
  • Awake
  • 싱글톤화, DondestroyOnLoad, 새로 생긴 GameObject 가 있으면 삭제(Destroy).








제네릭 싱글톤

제네릭 싱글톤 만들어서 필요한 매니저에 상속

제네릭 싱글톤
using UnityEngine;

public class Singleton <T>: MonoBehaviour where T: Component
{
    private static T_instance;

    public static T instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = FindObjectOfType<T>();

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

            return _instance;
        }
    }

    public void Awake()
    {
        if (_instance == null)
        {
            _instance = this as T;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

public class GameManager : Singleton<GameManager>
{
    void Start()
    {

    }
}



[C#] 싱글톤 패턴 정리

TOP


📔

댓글남기기