[디자인 패턴] Unity에서 싱글 톤 패턴 구현

머리말

    디자인 패턴은 많은 개발자들이 장기 개발 과정에서 요약 한 몇 가지 일반적인 문제에 대한 최상의 솔루션입니다
    . 싱글 톤 패턴은 가장 간단하고 가장 일반적으로 사용되는 패턴 중 하나입니다. 문제는 재사용 된 전역 객체를 자주 생성하고 파괴하면 시스템 리소스가 낭비된다는 것입니다. 따라서 시스템 자원을 절약하기 위해 인스턴스화 수를 합리적으로 제어하려는 상황에 적합하며 다음과 같은 특성이 있습니다.

1. 싱글 톤 클래스의 인스턴스는 하나만 만들 수 있습니다.

2. 싱글 톤 클래스의 인스턴스는 외부 세계를 통하지 않고 자체적으로 생성됩니다.

3. 싱글 톤 클래스는이 인스턴스를 외부 객체에 제공해야합니다.

위의 참조는 신인 자습서 : 싱글 톤 모드 에서 가져온 것입니다 .



이행

    유니티의 싱글 모드는 크게 두 가지 범주로 나눌 수 있습니다 :
MonoBehaviour 클래스를 상속 하고 MonoBehaviour 클래스를 상속하지 .


MonoBehaviour 클래스의 구현 상속

    MonoBehaviour 서브 클래스가 싱글 톤 모드를 구현하는 방법은 매우 간단합니다. 정적 인스턴스를 생성하고 인스턴스 = this를 추가하면됩니다. 코드는 다음과 같습니다.

public class Singleton : MonoBehaviour
{
    
    
    public static Singleton instance;	//创建静态实例
	
	//防止外部进行额外的实例化将构造函数设为private
    private Singleton()
    {
    
     
        
    }

    void Awake()
    {
    
    
        instance = this;
    }

}

    생성자의 민영화는 외부에서 추가 인스턴스화를 방지 할 수 있습니다.

인스턴스화 방지



MonoBehaviour 클래스의 구현을 상속하지 않습니다.

    하지 상속 MonoBehaviour 클래스 구현은 약간 더 복잡뿐만 아니라 같은 많은 다른 상황 구현에 적용된다 ...... 등 배고픈 사람 스타일, 게으른 유형, 정적 내부 클래스, 스레드 안전 게으른, 퍼펙트 잠금 장치,
    여기 당신을 위에 나열된 처음 세 가지 구현 방법에 대해 이야기하겠습니다.

게으른 남자

    lazy 스타일의 가장 큰 특징은 처음에만 초기화된다는 것입니다. (lazy loading, 극도의 메모리 자원 낭비를 피합니다) 구현이 간단하지만 멀티 스레드 안전성을 실현하지 못한다는 단점이 있습니다.

코드 쇼 :

public class Singleton
{
    
    
    private static Singleton instance;
	
	//同样地,用私有化的构造函数来防止外界进行实例化
    Singleton(){
    
    }

    //提供给外界进行调用实例的方法,当然,也可以使用属性来进行代替
    public static Singleton GetSingleton() 
    {
    
    
        //如果进行调用时instance为null则进行初始化
        if (instance == null) 
        {
    
    
            instance = new Singleton();
        }
        return instance;
    }

}


배고픈 중국어

    게으른 남자가 있기 때문에 더 부지런한 배고픈 남자가있는 것은 당연한 일인데, 이름에서 알 수 있듯이 첫 번째 호출에서만 초기화되는 게으른 남자와는 다릅니다.

인스턴스가 선언되면 초기화됩니다 .

코드 쇼 :

public class Singleton
{
    
    
	//在进行实例声明的时候就完成初始化
    private static Singleton instance = new Singleton();
	
	//同样地,用私有化的构造函数限制外界进行实例化
    Singleton(){
    
    }

    //提供给外界进行调用实例的方法
    public static Singleton GetSingleton() 
    {
    
    
        return instance;
    }

}

    이런 식으로 보면 배고픈 스타일과 게으른 스타일 사이에 차이가 거의 없다고 생각하십니까?하지만 사실 그들 사이에는 큰 차이가 있습니다.

배고픈 사람은 스레드 안전성을 얻을 수 있습니다 .

선언 될 때 이미 초기화 되었기 때문에

반드시 사용되지 않는 싱글 톤으로 쓰레기 객체를 생성하고 메모리를 낭비하는 것은 쉽습니다.


정적 내부 클래스

    정적 내부 클래스의 방법은 위의 두 가지보다 구현이 약간 더 복잡하지만 lazy loding 및 다중 스레드 안전성도 고려합니다.

코드 쇼 :

public class Singleton
{
    
    
    Singleton(){
    
    }

    //提供给外界进行调用实例的方法
    public static Singleton GetSingleton() 
    {
    
    
        return InitSingleton.Instance;
    }

    //使用静态内部类完成初始化
    private static class InitSingleton 
    {
    
     
        public static Singleton Instance = new Singleton();
    }
}

    따라서 질문은 다시 정적 내부 클래스가 두 가지를 모두 달성하는 방법입니다.

    우리는 알고 클래스가로드 될 때 정적 멤버의 초기화가 수행되며, 우리가 GetSingleton () 메서드를 호출 한 전에 InitSingleton 클래스는 모든 호출하게하지 않은 ,
    그래서 자연스럽게 싱글 싱글 초기화되지 않았습니다 .

배고픈 사람과 같은 유형의 다중 스레드 안전 구현 의;



효율적인 적용

    싱글 톤 패턴의 실현은 해결되었지만 각 클래스가 싱글 톤을 구현해야 할 때 이것을 작성하는 것이 너무 번거 롭습니까?

    그래서 여기서는 객체 지향적 사고의 캡슐화와 상속의 전환입니다
. 싱글 톤 패턴을 기본 클래스로 캡슐화하고 싱글 톤 패턴을 구현해야하는 다른 클래스는 싱글 톤 패턴 클래스 만 상속하면됩니다.

싱글 톤 패턴의 기본 클래스는 다음과 같습니다 (예를 들어 배고픈 중국어).


public class Singleton<T> : MonoBehaviour where T : Component
{
    
    
    protected static GameObject SLT;
    protected static T instance;

    public static T Instance
    {
    
    
        get
        {
    
    
            if (instance == null)
            {
    
    
                if (SLT == null) 
                {
    
    
                	//负责进行调用的媒介
                    SLT = GameObject.Find("GlobalController").gameObject;
                }
                instance = SLT.GetComponent<T>();
            }
            return instance;
        }
    }

    protected Singleton(){
    
    }
}

하위 클래스가 상속 될 때 다음과 같은 형식
하위 클래스 상속
만 있으면되지만 이런 방식으로 호출 할 수 없습니다 . 하위 클래스의 스크립트는 액세스하기 위해 호출 미디어 개체에 마운트되어야합니다 . 빈 개체를 사용하여 특별히 마운트 할 수 있습니다. 그리고 이러한 전역 컨트롤을 관리하는 단일 스크립트

추천

출처blog.csdn.net/Jourofant/article/details/108578615