디자인 모드 노트 - 원형 모드 (Prototype)
아 날로 그 그래프
묘사 하 다.
원형 모드:
자신 을 복제 하 는 인터페이스 인 Clone 방법 을 제공 합 니 다.
응용 장면
하나의 값 형식 (int) 의 Age 속성, 두 개의 참조 형식 Name (string) 과 Course 속성 을 포함 하 는 학생 클래스 를 정의 합 니 다.
public class Course
{
public string Name { get; set; }
}
public class Student : ICloneable
{
public string Name { get; set; }
public int Age { get; set; }
public Course Course { get; set; }
public object Clone()
{
return this.MemberwiseClone();
}
}
static void Main(string[] args)
{
string value = ConfigurationManager.AppSettings["prototypePattern"];
Student student = (Student)Assembly.Load(value.Substring(0, value.IndexOf('.'))).CreateInstance(value);
student.Name = "Jim";
student.Age = 20;
student.Course = new Course() { Name = "C++" };
Console.WriteLine("student:" + student.Name + "\t" + student.Age + "\t" + student.Course.Name);
Console.WriteLine();
Student student1 = (Student)student.Clone();
student1.Name = "Tom";
student1.Age = 21;
student1.Course.Name = "C#";
Console.WriteLine("student:" + student.Name + "\t" + student.Age + "\t" + student.Course.Name);
Console.WriteLine("student1:" + student1.Name + "\t" + student1.Age + "\t" + student1.Course.Name);
Console.WriteLine();
student1.Course.Name = "Java";
Console.WriteLine("student:" + student.Name + "\t" + student.Age + "\t" + student.Course.Name);
Console.WriteLine("student1:" + student1.Name + "\t" + student1.Age + "\t" + student1.Course.Name);
}
출력:
student:Jim 20 C++
student:Jim 20 C#student1:Tom 21 C#
student:Jim 20 Javastudent1:Tom 21 Java
인쇄 결 과 를 보면 원래 대상 student 에 게 새로운 student 1 대상 을 복사 하고 student 1 속성 에 값 을 부여 한 후에 원래 대상 student 의 Age 와 Name 은 변 하지 않 았 고 CourseName 은 변 했다.복사 후에 student 는 student 1 의 Age 와 Name 을 복사 하 였 고 student 1 의 Course 는 여전히 student 의 Course 주 소 를 가리 키 기 때문에 student 1 의 CourseName 이 바 뀌 었 을 때 student 의 CourseName 도 이에 따라 바 뀌 었 습 니 다. 이것 이 바로 얕 은 복사 입 니 다.
그러나 실제 응용 에서 이런 일이 발생 하 는 것 을 원 하지 않 는 다. 즉, 복사 대상 에 변화 가 생 겨 원래 의 대상 에 영향 을 주어 서 는 안 된다 는 것 이다.이 유 는 간단 하 다. 톰 이 C 를 선택 했다 고 해서 Jim 에 게 이미 선택 한 C + + 이 과목 을 C 로 바 꿔 야 한다 고 요구 할 수 는 없다.이 문 제 를 해결 하려 면 새로운 대상, 즉 깊 은 복사 가 필요 하 다.
다음은 Student 류 와 Course 류 를 조금 바 꾸 고 직렬 화 와 반 직렬 화 를 통 해 새로운 student 를 만 듭 니 다.
[Serializable]
public class Course
{
public string Name { get; set; }
}
[Serializable]
public class Student : ICloneable
{
public string Name { get; set; }
public int Age { get; set; }
public Course Course { get; set; }
public object Clone()
{
using (Stream objectStream = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objectStream, this);
objectStream.Seek(0, SeekOrigin.Begin);
return formatter.Deserialize(objectStream);
}
}
}
출력:
student:Jim 20 C++
student:Jim 20 C++student1:Tom 21 C#
student:Jim 20 C++student1:Tom 21 Java
얕 은 복사 와 깊 은 복사 의 차이:
얕 은 복사: 값 형식 과 string 형식 을 직접 복사 하고 인용 유형 에 대해 같은 지침 을 사용 합 니 다.두 대상 사이 에 결합 이 존재 합 니 다.
딥 복사: 대상 에 게 새로운 대상 을 복사 하고 두 대상 간 의 결합 도 는 0 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.