3D RPG 만들기! (7) 싱글톤

    싱글톤을 쓰면서 따로 블로그에 적어둔적이 없어서 추가했다.

     

    싱글톤은 디자인패턴을 공부했더라면 알 단어인데,

    객체의 인스턴스를 하나만 만드는 패턴이다.

     

    싱글톤의 장점

    인스턴스가 하나면 접근하기가 편리해진다.

    여러 객체가 접근할 때 싱글톤으로 만들면 접근할 객체가 하나밖에 없기때문에 바로 접근이 가능하다.

    그리고 고정된 메모리에 한번의 생성만 필요하니 메모리 절감도 된다.

     

    하지만 다른 디자인패턴과 다르게 SOLID원칙중 위배되는 사항도 있는데,

    DIP원칙, OCP원칙 등 위배되는게 있다.

    그리고 테스트도 어려워진다는 단점이 있다.

     

    실제로 싱글톤은 디자인패턴의 대표적인 패턴에 포함되지만

    유니티에서 쓰는걸 혐오할정도로 싫어하는 사람도 많다.

     

    물론 나는 적당히 쓰는건 언제나 좋다고 생각한다.

     

     

     

    싱글톤

    예전엔 싱글톤을 쓸 때 싱글톤이 필요한 클래스마다 일일이 써줬다.

    하지만 이제는 제네릭으로 싱글톤을 정의해버리고, 상속받기만 하면 자동으로 싱글톤이 되는 방식으로 사용한다.

     

    Singleton

    public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
    {
        private static T instance;
    
        public static T Instance
        {
            get
            {
                instance = (T)FindObjectOfType(typeof(T));
                
                if (instance == null)
                {
                    var ob = new GameObject(typeof(T).Name, typeof(T));
                    instance = ob.GetComponent<T>();
                }
                
                return instance;
            }
        }
    
        protected virtual void Awake()
        {
            DontDestroyOnLoad(this.gameObject);
        }
    }

    제네릭인 T타입으로 어떤 클래스든 상속받고 자기자신을 <>사이에 넣으면 된다.

     

    사용예시

    public class GameManager : Singleton<GameManager> 
    {
        ~~~
    }

     

    앞부분에 쓴 포스팅에 Singleton을 쓴부분이 몇개 더 있지싶다.

    댓글