c\#디자인 모델 의 단일 예 모델 의 실현 방식
단일 모드 는 우리 에 게 조금도 모드 적 이지 않 고 흔히 볼 수 있 는 이름 입 니 다.단일 모드 가 프로그램 에서 의 실제 효 과 는 한 프로그램 에서 하나의 인 스 턴 스 만 확보 하고 전체 방문 점 을 제공 하여 시스템 자원 을 절약 하 는 것 입 니 다.
단일 모드 는 실제 개발 에서 나 소프트웨어 응용 에서 흔히 볼 수 있 습 니 다.예 를 들 어 windows 시스템 의 작업 관리자,IIS 의 HttpApplication,실제 프로젝트 의 로그 구성 요소 등 입 니 다.
실현 방식
단일 모드 에서 하나의 인 스 턴 스 를 실현 하기 위해 서 는 인 스 턴 스 를 만 들 지 않 고 클래스 자체 로 만 인 스 턴 스 를 만 들 수 있 습 니 다.효 과 를 실현 하기 위해 서 는 개인 구조 함 수 를 정의 해 야 합 니 다.
단일 모델 의 실현 방식 은 굶 주 린 사람 식,게 으 른 사람 식,이중 검증 식,정태 내부 류 가 있다.
다음은 각 실현 방식 에 대해 간단 한 실례 를 만 들 고 그 장단 점 을 살 펴 보 자.
굶 주 린 사람 식
/// <summary>
/// Singleton ( )
/// , 。
/// : , 。
/// : , 。
/// classloder , ,instance ,
/// , getInstance ,
/// ( ) , instance lazy loading 。
/// </summary>
public class SingleObject
{
// SingleObject
private static SingleObject instance = new SingleObject();
// private,
private SingleObject() {
Console.WriteLine(" . ");
}
//
public static SingleObject GetInstance()
{
return instance;
}
public void ShowMessage()
{
Console.WriteLine("Hello World. ");
}
}
게으름뱅이 식
/// <summary>
/// Singleton ( )
/// lazy loading, , , ,99% 。
/// : , 。
/// : , , 。
/// </summary>
public class SingleObject1
{
// SingleObject
private static SingleObject1 instance;
// private,
private SingleObject1() { }
//
public static SingleObject1 GetInstance()
{
if (instance == null)
{
instance = new SingleObject1();
Console.WriteLine(" . ");
}
return instance;
}
public void ShowMessage()
{
Console.WriteLine("Hello World. ");
}
}
이중 검증 식
/// <summary>
/// Singleton ( )
/// lazy loading, , , ,99% 。
/// : , , 。
/// : synchronized , 。
/// </summary>
public class SingleObject2
{
// SingleObject
private static SingleObject2 instance;
//
private static readonly object locker = new object();
// private,
private SingleObject2() { }
//
public static SingleObject2 GetInstance()
{
//// , ,
if (instance == null)
{
lock (locker)
{
//// , ,
if (instance == null)
{
instance = new SingleObject2();
Console.WriteLine(" . ");
}
}
}
return instance;
}
public void ShowMessage()
{
Console.WriteLine("Hello World. ");
}
}
정적 내부 클래스
/// <summary>
/// Singleton ( )
/// ,
/// ,
/// </summary>
public class SingletonStatic
{
/// <summary>
///
/// </summary>
public class SingletonStaticInner
{
/// <summary>
/// , beforefieldinit
/// ,
/// </summary>
static SingletonStaticInner() { }
/// <summary>
///
/// </summary>
internal static SingletonStatic singletonStatic = new SingletonStatic();
}
/// <summary>
///
/// </summary>
private SingletonStatic() {
Console.WriteLine(" . ");
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public static SingletonStatic GetInstance()
{
return SingletonStaticInner.singletonStatic;
}
public void ShowMessage()
{
Console.WriteLine("Hello World. ");
}
}
모든 생 성 방식 테스트콘 솔 프로그램 을 만 들 고 다 중 스 레 드 를 통 해 모든 실현 방식 을 사용 하 며 인 스 턴 스 횟수 분석 을 봅 니 다.
/*
: , 。
: 。
: , 。
: , , 。
: 。
:
:
1、windows
2、IIS HttpApplication, HttpModule HttpApplication
:
1、
2、
3、
4、
*/
class Program
{
static void Main(string[] args)
{
TaskFactory taskFactory = new TaskFactory();
List<Task> taskList = new List<Task>();
//// --
for (int i = 0; i < 5; i++)
{
taskList.Add(taskFactory.StartNew(() =>
{
SingleObject.GetInstance();
}));
}
//// --
for (int i = 0; i < 5; i++)
{
taskList.Add(taskFactory.StartNew(() =>
{
SingleObject1.GetInstance();
}));
}
//// --
for (int i = 0; i < 5; i++)
{
taskList.Add(taskFactory.StartNew(() =>
{
SingleObject2.GetInstance();
}));
}
//// --
for (int i = 0; i < 5; i++)
{
taskList.Add(taskFactory.StartNew(() =>
{
SingletonStatic.GetInstance();
}));
}
Console.ReadLine();
}
}
실행 결과:결 과 를 통 해 알 수 있 듯 이 게으름뱅이 식 은 실제 적 으로 두 개의 인 스 턴 스 를 만 들 었 기 때문에 다 중 스 레 드 에서 게으름뱅이 식 은 스 레 드 가 안전 하지 않 은 문제 가 있다.
총결산
단일 사례 모델 에 따라 모든 실현 방식 을 비교 분석 하고 실제 사용 과정 에서:
단일 스 레 드 응용 환경 이 라면 게으름뱅이 모델 을 사용 하 는 것 을 권장 합 니 다.
다 중 스 레 드 응용 환경 이 라면 정적 내부 클래스 를 사용 하 는 것 을 권장 합 니 다.
자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.