예 를 들 어 C\#프로 그래 밍 에서 디자인 모델 중의 단일 모델 에 대한 활용 을 설명 합 니 다.
단 례 모델 로 말하자면 여러분 의 첫 번 째 반응 은 단 례 모델 이 무엇 입 니까?'단일 사례'라 는 글자 의 의미 에서 하나의 사례 만 있 기 때문에 하나의 사례 모델 은 하나의 사례 만 있 는 실현 방법 을 확보 하 는 것 이다.다음은 하나의 사례 모델 의 공식 정 의 를 제시한다.하나의 사례 만 있 고 하나의 전체적인 방문 점 을 제공 하 는 것 이다.여러분 이 단일 모델 을 잘 이해 하도록 돕 기 위해 여러분 은 아래 의 유형 도 를 결합 하여 이해 할 수 있 고 그 다음 에 단일 모델 의 실현 방향 도 분석 할 수 있 습 니 다.
왜 단일 모드 가 있 습 니까?
단일 모델 의 소 개 를 보면 자연히 모두 가 이런 의문 을 가지 게 될 것 이다.왜 단일 모델 이 있어 야 하 는가?그것 은 어떤 상황 에서 사 용 했 습 니까?단일 모델 의 정의 에서 우 리 는 알 수 있 듯 이 단일 모델 의 사용 은 당연히 우리 시스템 의 특정한 대상 이 하나의 사례 만 필요 한 상황 이다.예 를 들 어 운영 체제 에 하나의 임무 관리자 만 있 고 파일 을 조작 할 때 같은 시간 에 하나의 사례 만 조작 할 수 있다.현실 생활 에서 이런 응용 장면 이 있 는 이상자연 은 소프트웨어 디자인 분야 에서 반드시 이런 해결 방안 이 있어 야 한다.(소프트웨어 디자인 도 현실 생활 에서 추상 적 이기 때문에)그래서 하나의 모델 도 생 겼 다.
단일 사례 모델 의 실현 방향 을 분석 하 다.
단일 모델 에 관 한 기본 개념 을 알 게 된 후에 다음 에 여러분 께 단일 모델 의 실현 방향 을 분석 해 드 리 겠 습 니 다.제 가 단일 모델 을 배 울 때 단일 모델 의 실현 코드 를 어떻게 보면 간단 하고 쉽게 이해 할 수 있 기 때 문 입 니 다.하지만 저 는 그것 이 낯 설 습 니 다.혹은 자신 이 코드 를 쓰 는 데 도 적 게 쓰 는 이유),그리고 마음 속 에는 항상 이런 의문 이 있 습 니 다.왜 앞 사람 이 이렇게 단일 모델 을 실현 할 수 있 습 니까?그들 은 어떻게 생각 합 니까?그 다음 에 자신의 생각 을 통 해 단일 모델 의 실현 방향 을 천천히 정리 했다.그리고 이때 도 단일 모델 모델 모델 이 라 고 생각 하지 않 는 다.다음은 나의 분석 과정 을 공유 하 겠 다.
우 리 는 하나의 사례 모델 의 개념(하나의 인 스 턴 스 만 확보 하고 하나의 전체 방문 점 을 제공 합 니 다)에 착안 하여 개념 을 두 부분 으로 나 눌 수 있 습 니 다.(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);
}
}
총결산여기까지 디자인 모델 의 단일 모델 을 소 개 했 습 니 다.이 글 을 통 해 여러분 들 은 단일 모델 에 대해 더욱 깊이 이해 할 수 있 기 를 바 랍 니 다.그리고 예전 에 단일 모델 을 접 해 본 적 이 없 거나 단일 모델 이 낯 설 다 는 친구 들 이 보고 놀 랐 으 면 좋 겠 습 니 다.그 렇 군요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.