C\#프로 그래 밍 에서 디자인 모드 의 원형 모드 를 사용 하 는 실례 설명
소프트웨어 시스템 에서 하나의 인 스 턴 스 를 만 드 는 과정 이 매우 비 싸 거나 복잡 하 며,이러한 인 스 턴 스 를 여러 개 만들어 야 할 때,만약 우리 가 new 연산 자 를 사용 하여 이러한 인 스 턴 스 를 만 들 면,이러한 인 스 턴 스 를 만 드 는 복잡 도와 더 많은 메모리 공간 을 소모 할 수 밖 에 없다.왜냐하면 메모리 에 같은 인 스 턴 스 대상 을 여러 개 분배 하기 때문이다.그 다음 에 공장 모델 로 이런 시스템 을 만 들 면 제품 류 가 계속 증가 함 에 따라 서브 류 의 수량 이 계속 증가 하고 오히려 시스템 의 복잡 도 를 증가 하기 때문에 여기 서 공장 모델 로 포장 류 를 만 드 는 과정 이 적당 하지 않 지만 원형 모델 은 이 문 제 를 잘 해결 할 수 있다.모든 사례 가 똑 같 기 때문이다.같은 인 스 턴 스 가 여러 개 필요 할 때 매번 new 연산 자 를 사용 하여 같은 인 스 턴 스 대상 을 만 들 필요 가 없습니다.이때 우 리 는 일반적인 생각 은 하나의 인 스 턴 스 대상 만 만 만 들 고 그 다음 에 더 많은 인 스 턴 스 가 필요 하 다 면 원래 의 이미지 복사 본 을 통 해 만 들 수 있 습 니 다.그러면 메모리 에 같은 인 스 턴 스 를 여러 개 만 들 필요 가 없습니다.메모리 의 소 모 를 줄 이 고 인 스 턴 스 의 재 활용 을 실현 합 니 다.그러나 이 사고방식 은 바로 원형 모델 의 실현 방식 이다.다음은 디자인 모델 중의 원형 디자인 모델 을 구체 적 으로 소개 한다.
2.원형 모델 에 대한 상세 한 소개
우 리 는 입 시 장면 의 실례 를 보 았 다.
기본 대상(일반적으로 인터페이스,추상 류):시험 문제(샘플)
원형 모델 의 복직 복제:필요 에 따라 시험 지 를 인쇄 하고 이곳 의 시험 지 는 모두 시험 문제 견본 을 복제 하 는 것 이다.
클 라 이언 트:학생 답안 지,같은 시험지,학생 이 문 제 를 똑 같이 풀 수 없습니다.
아 날로 그:
인터페이스:시험지 샘플 코드
/// <summary>
///
/// </summary>
public class SelectTest
{
private string other;
public string
{
get
{
return this.other;
}
set
{
this.other = value;
}
}
}
/// <summary>
///
/// </summary>
public interface Itest
{
Itest Clone();
string
{
get;
set;
}
string
{
get;
set;
}
string
{
get;
set;
}
SelectTest
{
get;
set;
}
Test Test
{
get;
set;
}
Test Test1
{
get;
set;
}
}
복제:복사기
/// <summary>
/// Itest
/// </summary>
public class Test : Itest
{
private string one;
private string two;
private string three;
private SelectTest other=new SelectTest();
public string
{
get
{
return this.one;
}
set
{
this.one = value;
}
}
public string
{
get
{
return this.two;
}
set
{
this.two = value;
}
}
public string
{
get
{
return this.three;
}
set
{
this.three = value;
}
}
public SelectTest
{
get
{
return this.other;
}
set
{
this.other = value;
}
}
#region IColorDemo
public Itest Clone()
{
//
return (Itest)this.MemberwiseClone();
}
#endregion
}
클 라 이언 트
static void Main()
{
//
Itest test = new Test();
//
Itest test1 = test.Clone();
// 1
test. = "23";
test. . = "18";
// 2
test1. = "24";
test1. . = "20";
//
Console.WriteLine("test :" + test. ); //23
Console.WriteLine("test . :" + test. . ); //20
Console.WriteLine("test1 :" + test1. ); //24
Console.WriteLine("test1 . :" + test1. . ); //20
Console.ReadKey();
}
주의:여기 두 사람 이 서로 다 르 게 대답 하 는데 왜 부가 문제 에서 아내 의 나 이 는 모두 20 입 니까?여 기 는 깊 은 복사,얕 은 복사 문제 와 관련 되 어 있 습 니 다.값 유형 은 스 택 에 놓 여 있 습 니 다.복사 한 후에 역 에서 다시 추가 합 니 다.class 는 인용 유형 에 속 합 니 다.복사 한 후에 스 택 에 지침 을 다시 분 배 했 지만 지침 은 같은 위치 에 있 는 자원 을 가 리 킵 니 다.얕 은 복사,값 형식 만 복사,깊 은 복사,인용 유형 도 복사 합 니 다.
해결 방안:
public Itest Clone()
{
//
Itest itst= (Itest)this.MemberwiseClone();
SelectTest st = new SelectTest();
st. = this.other. ;
itst. = st;
return itst;
}
직렬 화 해결 사용
/// <summary>
///
/// </summary>
[Serializable]
public class SelectTest
{
private string other;
public string
{
get
{
return this.other;
}
set
{
this.other = value;
}
}
}
/// <summary>
///
/// </summary>
public interface Itest
{
Itest Clone();
string
{
get;
set;
}
string
{
get;
set;
}
string
{
get;
set;
}
SelectTest
{
get;
set;
}
}
/// <summary>
/// Itest
/// </summary>
public class Test : Itest
{
private string one;
private string two;
private string three;
private SelectTest other=new SelectTest();
public string
{
get
{
return this.one;
}
set
{
this.one = value;
}
}
public string
{
get
{
return this.two;
}
set
{
this.two = value;
}
}
public string
{
get
{
return this.three;
}
set
{
this.three = value;
}
}
public SelectTest
{
get
{
return this.other;
}
set
{
this.other = value;
}
}
public Itest Clone()
{
SerializableHelper SerializableHelper = new .SerializableHelper();
string target = SerializableHelper.Serializable(this);
return SerializableHelper.Derializable<Itest>(target);
}
}
public class SerializableHelper
{
public string Serializable(object target)
{
using (MemoryStream stream = new MemoryStream())
{
new BinaryFormatter().Serialize(stream, target);
return Convert.ToBase64String(stream.ToArray());
}
}
public object Derializable(string target)
{
byte[] targetArray = Convert.FromBase64String(target);
using (MemoryStream stream = new MemoryStream(targetArray))
{
return new BinaryFormatter().Deserialize(stream);
}
}
public T Derializable<T>(string target)
{
return (T)Derializable(target);
}
}
이것 이 바로 원형 모델 에 대한 운용 이다.원형 모델 의 실현 코드 를 소개 한 후에 다음 에 원형 모델 의 유형 도 를 보고 유형 도 를 통 해 원형 모델 이 중 류 간 의 관 계 를 정리한다.구체 적 인 유형 도 는 다음 과 같다.3.원형 모델 의 장단 점
원형 모델 의 장점 은 다음 과 같다.
프로 토 타 입 모드 는 고객 에 게 새로운 인 스 턴 스 를 만 드 는 복잡성 을 숨 겼 습 니 다.
원형 모델 은 동적 으로 증가 하거나 비교적 적은 제품 류 를 허용 한다.
원형 모델 은 사례 의 구축 구 조 를 간소화 하고 공장 방법 모델 은 제품 류 등급 구조 와 같은 등급 구 조 를 가 져 야 하 며 원형 모델 은 이렇게 할 필요 가 없다.
제품 류 는 제품 의 등급 구 조 를 미리 확정 할 필요 가 없다.왜냐하면 원형 모델 은 그 어떠한 등급 구조 에 도 적용 되 기 때문이다.
원형 모델 의 단점 은 다음 과 같다.
각 종 류 는 반드시 복제 방법 을 갖 추어 야 한다.
복제 방법 을 갖 추 려 면 클래스 의 기능 을 전반적 으로 고려 해 야 한다.이것 은 새로운 클래스 에 대해 어렵 지 않 지만 기 존의 클래스 에 대해 반드시 쉬 운 것 은 아니다.특히 직렬 화 를 지원 하지 않 는 간접 대상 을 인용 하거나 순환 구 조 를 포함 하 는 것 을 인용 할 때.
4..NET 에서 원형 모델 의 실현
.NET 에 서 는 ICloneable 인터페이스(이 인 터 페 이 스 는 원형 이 고 복제 방법 을 제공 하 며 상기 코드 에서 Monkey KingPrototype 추상 류)에서 Clone()방법 으로 원형 모델 을 쉽게 실현 할 수 있 습 니 다.만약 에 우리 가 사용자 정의 하 는 클래스 가 크 론 기능 을 가지 고 있다 면 먼저 클래스 계승 과 ICloneable 인 터 페 이 스 를 정의 하고 Clone 방법 을 실현 합 니 다..NET 에서 원형 모드 를 구현 한 클래스 는 다음 그림 과 같 습 니 다.(그림 에서 부분 만 캡 처 하고 Reflector 역 컴 파일 도구 로 볼 수 있 습 니 다)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.