디자인 모드 노트 - 원형 모드 (Prototype)

9990 단어
원형 모드 (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 이다.

좋은 웹페이지 즐겨찾기