예 를 들 어 C\#프로 그래 밍 에서 디자인 모델 중의 단일 모델 에 대한 활용 을 설명 합 니 다.

7736 단어 C#단일 모드
단일 모드 소개
단 례 모델 로 말하자면 여러분 의 첫 번 째 반응 은 단 례 모델 이 무엇 입 니까?'단일 사례'라 는 글자 의 의미 에서 하나의 사례 만 있 기 때문에 하나의 사례 모델 은 하나의 사례 만 있 는 실현 방법 을 확보 하 는 것 이다.다음은 하나의 사례 모델 의 공식 정 의 를 제시한다.하나의 사례 만 있 고 하나의 전체적인 방문 점 을 제공 하 는 것 이다.여러분 이 단일 모델 을 잘 이해 하도록 돕 기 위해 여러분 은 아래 의 유형 도 를 결합 하여 이해 할 수 있 고 그 다음 에 단일 모델 의 실현 방향 도 분석 할 수 있 습 니 다.
2016217115542448.png (813×515)
왜 단일 모드 가 있 습 니까?
단일 모델 의 소 개 를 보면 자연히 모두 가 이런 의문 을 가지 게 될 것 이다.왜 단일 모델 이 있어 야 하 는가?그것 은 어떤 상황 에서 사 용 했 습 니까?단일 모델 의 정의 에서 우 리 는 알 수 있 듯 이 단일 모델 의 사용 은 당연히 우리 시스템 의 특정한 대상 이 하나의 사례 만 필요 한 상황 이다.예 를 들 어 운영 체제 에 하나의 임무 관리자 만 있 고 파일 을 조작 할 때 같은 시간 에 하나의 사례 만 조작 할 수 있다.현실 생활 에서 이런 응용 장면 이 있 는 이상자연 은 소프트웨어 디자인 분야 에서 반드시 이런 해결 방안 이 있어 야 한다.(소프트웨어 디자인 도 현실 생활 에서 추상 적 이기 때문에)그래서 하나의 모델 도 생 겼 다.
단일 사례 모델 의 실현 방향 을 분석 하 다.
단일 모델 에 관 한 기본 개념 을 알 게 된 후에 다음 에 여러분 께 단일 모델 의 실현 방향 을 분석 해 드 리 겠 습 니 다.제 가 단일 모델 을 배 울 때 단일 모델 의 실현 코드 를 어떻게 보면 간단 하고 쉽게 이해 할 수 있 기 때 문 입 니 다.하지만 저 는 그것 이 낯 설 습 니 다.혹은 자신 이 코드 를 쓰 는 데 도 적 게 쓰 는 이유),그리고 마음 속 에는 항상 이런 의문 이 있 습 니 다.왜 앞 사람 이 이렇게 단일 모델 을 실현 할 수 있 습 니까?그들 은 어떻게 생각 합 니까?그 다음 에 자신의 생각 을 통 해 단일 모델 의 실현 방향 을 천천히 정리 했다.그리고 이때 도 단일 모델 모델 모델 이 라 고 생각 하지 않 는 다.다음은 나의 분석 과정 을 공유 하 겠 다.
우 리 는 하나의 사례 모델 의 개념(하나의 인 스 턴 스 만 확보 하고 하나의 전체 방문 점 을 제공 합 니 다)에 착안 하여 개념 을 두 부분 으로 나 눌 수 있 습 니 다.(1)하나의 인 스 턴 스 만 확보 합 니 다.(1)2)전역 접근 점 을 제공 합 니 다.다음은 두 사람 이 대화 하 는 방식 으로 여러분 들 이 분석 방향 을 빨리 파악 하도록 도와 드 리 겠 습 니 다.
풋내기:어떻게 한 가지 사례 만 확보 합 니까?
늙 은 새:그럼 내 가 분석 해 줄 게.네가 만 든 인 스 턴 스 는 어떤 방식 으로 만 들 었 을 까?
초보 자:new 키 워드 를 사용 하 세 요.new 아래 에 이러한 인 스 턴 스 를 만 들 면 이러한 속성 과 인 스 턴 스 방법 을 사용 할 수 있 습 니 다.
늙 은 새:그럼 왜 new 키 워드 를 사용 하여 클래스 의 인 스 턴 스 를 만 들 수 있 는 지 생각해 보 셨 어 요?
초보:이거 조건 도 있어 요?읊다,읊조리다이때 컴 파 일 러 는 공유 무 참 구조 함 수 를 만 드 는 데 도움 을 줄 것 이다)
늙 은 새:좋아,대답 이 맞 아.그러면 너의 의혹 이 풀 리 잖 아.
초보:그럼 나 는 어디에서 클래스 의 인 스 턴 스 를 만들어 야 합 니까?
늙 은 새:바보 야.당연히 클래스 에서 만 들 었 지.이 의문 에 대한 설명 은 모든 스 레 드 에 자신의 스 레 드 스 택 이 있 고 정적 으로 정 의 된 것 은 주로 다 중 스 레 드 에서 인 스 턴 스 를 확보 하기 위 한 것 입 니 다)
초보:아,이제 완전히 알 겠 습 니 다.하지만 저 는 또 다른 의문 이 있 습 니 다.현재 의 인 스 턴 스 는 클래스 내부 에 만 들 어 졌 습 니 다.그러면 외부 에서 어떻게 이 인 스 턴 스 를 얻어 서 사용 합 니까?
늙 은 새:이 건 공유 방법 이나 속성 을 정의 하여 이러한 인 스 턴 스 를 공개 할 수 있 습 니 다.
위의 분석 을 통 해 여러분 도 하나의 모델 의 실현 코드 를 쉽게 쓸 수 있 을 것 이 라 고 믿 습 니 다.다음은 구체 적 인 실현 코드 를 보 겠 습 니 다.
다음은 Singleton.cs 의 내용 입 니 다.

using System; 
using System.Collections; 
using System.Collections.Generic; 
  
  
public class Singleton : MonoBehaviour 
{ 
  private static GameObject m_Container = null; 
  private static string m_Name = "Singleton"; 
  private static Dictionary<string, object> m_SingletonMap = new Dictionary<string, object>(); 
  private static bool m_IsDestroying = false; 
    
  public static bool IsDestroying 
  { 
    get { return m_IsDestroying; } 
  } 
    
  public static bool IsCreatedInstance(string Name) 
  { 
    if(m_Container == null) 
    { 
      return false; 
    } 
    if (m_SingletonMap!=null && m_SingletonMap.ContainsKey(Name))  
    { 
      return true; 
    } 
    return false; 
      
  } 
  public static object getInstance (string Name) 
  { 
    if(m_Container == null) 
    { 
      Debug.Log("Create Singleton."); 
      m_Container = new GameObject (); 
      m_Container.name = m_Name;   
      m_Container.AddComponent (typeof(Singleton)); 
    } 
    if (!m_SingletonMap.ContainsKey(Name)) { 
      if(System.Type.GetType(Name) != null) 
      { 
        m_SingletonMap.Add(Name, m_Container.AddComponent (System.Type.GetType(Name))); 
      } 
      else 
      { 
        Debug.LogWarning("Singleton Type ERROR! (" + Name + ")"); 
      } 
    } 
    return m_SingletonMap[Name]; 
  }   
    
  public void RemoveInstance(string Name) 
  { 
    if (m_Container != null && m_SingletonMap.ContainsKey(Name)) 
    { 
      UnityEngine.Object.Destroy((UnityEngine.Object)(m_SingletonMap[Name])); 
      m_SingletonMap.Remove(Name); 
        
      Debug.LogWarning("Singleton REMOVE! (" + Name + ")"); 
    } 
  } 
  
  void Awake () 
  { 
    Debug.Log("Awake Singleton."); 
    DontDestroyOnLoad (gameObject); 
  } 
    
  void Start() 
  { 
    Debug.Log("Start Singleton."); 
  }   
    
  void Update() 
  { 
  } 
    
  void OnApplicationQuit() 
  { 
    Debug.Log("Destroy Singleton"); 
    if(m_Container != null) 
    { 
      GameObject.Destroy(m_Container); 
      m_Container = null; 
      m_IsDestroying = true; 
    }       
  } 
    
}
코드 는 대부분 쉽게 알 아 볼 수 있 습 니 다.다음은 몇 가지 주의 할 점 을 소개 합 니 다.
다른 코드 에서 하나의 예 를 방문 해 야 할 때 getInstance 함수 만 호출 하면 됩 니 다.인 자 는 방문 해 야 할 스 크 립 트 의 이름 입 니 다.이 함수 좀 봅 시다.그것 은 먼저 모든 단일 사례 가 있 는 용기 m 를 판단 한다.Container 가 비어 있 는 지 여부(실제로 필드 에 하나의 Gameobject 가 존재 하 는 지,위 에 하나의 Singleton 스 크 립 트 가 묶 여 있 는 지),비어 있 으 면 자동 으로 대상 을 만 든 다음'Singleton'이라는 이름 으로 Singleton 스 크 립 트 를 묶 습 니 다.m_싱글 톤 맵 은 모든 단일 맵 을 유지 하 는 것 을 책임 집 니 다.어떤 단 례 를 처음 방 문 했 을 때,자동 으로 mContainer 에 이 단일 형식의 Component 를 추가 하고 단일 맵 에 저장 한 다음 이 예 를 되 돌려 줍 니 다.따라서 우 리 는 하나의 사례 의 생 성 이 완전히 자동 이라는 것 을 알 수 있 습 니 다.당신 은 어디 에 있 는 지,언제 스 크 립 트 를 묶 을 지 전혀 고려 할 필요 가 없습니다.이것 이 얼마나 기 쁜 일 인지 알 수 있 습 니 다!
Awake 함수 에 코드 Dont Destroy OnLoad(gameObject)가 있 습 니 다.이것 은 매우 중요 한 것 이다.이 말 은 우리 의 장면 이 변화 할 때 단일 모델 은 어떠한 영향 도 받 지 않 는 다 는 것 을 의미한다.그 밖 에 이 말 도 Awake 함수 에 넣 어야 합 니 다.Start 함수 에 넣 으 면 안 됩 니 다.이것 은 두 함수 의 실행 순서 에 의 해 결정 되 는 것 입 니 다.반대로 하면 방문 사례 가 성공 하지 못 할 수 있 습 니 다.아래 의 예 에서 더욱 상세 하 게 소개 할 것 입 니 다.
OnapplicationQuit 함수 에서 우 리 는 단일 모드 를 소각 할 것 입 니 다.
마지막 으로 중요 합 니 다:OnDestroy 함수 에서 단일 모드 에 직접 접근 하지 마 세 요!이렇게 하면 단 례 로 소각 할 수 없 게 될 가능성 이 크다.프로그램 이 종료 되 어 단일 모드 를 없 애 려 고 할 때,우 리 는 다른 스 크 립 트 의 OnDestroy 함수 에서 다시 접근 을 요청 합 니 다.그러면 새로운 단일 예 를 다시 만 들 고 없 애 지 않 기 때 문 입 니 다.(이전에 이미 한 번 없 앴 기 때 문 입 니 다.)꼭 방문 하려 면 반드시 IsCreated Instance 를 호출 하여 이 사례 가 존재 하 는 지 여 부 를 판단 해 야 합 니 다.
.NET 단일 모드 구현 클래스
단일 모드 를 이해 한 후,채소 새 는 이어서.NET FrameWork 라 이브 러 리 에서 단일 모드 의 실현 이 있 습 니까?라 고 물 었 다.
보 니.NET 라 이브 러 리 에 단일 모델 의 실현 클래스 가 존재 합 니 다.그러나 이 종 류 는 공개 되 지 않 았 습 니 다.다음은 이러한 유형의 실현 을 구체 적 으로 살 펴 보 겠 습 니 다.(이 종 류 는 System.dll 프로그램 집합 에 구체 적 으로 존재 하고 네 임 스페이스 는 System 입 니 다.여러분 은 반사 도구 인 Reflector 로 소스 코드 를 찾 아 볼 수 있 습 니 다)

//          
  //               
  internal sealed class SR
  {
    private static SR loader;
    internal SR()
    {
    }
    //            ,                 
    //                  
    private static SR GetLoader()
    {
      if (loader == null)
      {
        SR sr = new SR();
        Interlocked.CompareExchange<SR>(ref loader, sr, null);
      }
      return loader;
    }
    //           GetLoader   
    public static object GetObject(string name)
    {
      SR loader = GetLoader();
      if (loader == null)
      {
        return null;
      }
      return loader.resources.GetObject(name, Culture);
    }
  }

총결산
여기까지 디자인 모델 의 단일 모델 을 소 개 했 습 니 다.이 글 을 통 해 여러분 들 은 단일 모델 에 대해 더욱 깊이 이해 할 수 있 기 를 바 랍 니 다.그리고 예전 에 단일 모델 을 접 해 본 적 이 없 거나 단일 모델 이 낯 설 다 는 친구 들 이 보고 놀 랐 으 면 좋 겠 습 니 다.그 렇 군요!

좋은 웹페이지 즐겨찾기