기사 디렉토리
머리말
디자인 패턴은 많은 개발자들이 장기 개발 과정에서 요약 한 몇 가지 일반적인 문제에 대한 최상의 솔루션입니다
. 싱글 톤 패턴은 가장 간단하고 가장 일반적으로 사용되는 패턴 중 하나입니다. 문제는 재사용 된 전역 객체를 자주 생성하고 파괴하면 시스템 리소스가 낭비된다는 것입니다. 따라서 시스템 자원을 절약하기 위해 인스턴스화 수를 합리적으로 제어하려는 상황에 적합하며 다음과 같은 특성이 있습니다.
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(){
}
}
하위 클래스가 상속 될 때 다음과 같은 형식
만 있으면되지만 이런 방식으로 호출 할 수 없습니다 . 하위 클래스의 스크립트는 액세스하기 위해 호출 미디어 개체에 마운트되어야합니다 . 빈 개체를 사용하여 특별히 마운트 할 수 있습니다. 그리고 이러한 전역 컨트롤을 관리하는 단일 스크립트