close up photo of programming of codes

codecungnhau.com

Một trang web về kỹ thuật lập trình

C# Design Patterns: Prototype (Clone)

Prototype là một mẫu thiết kế khởi tạo cho phép sao chép các đối tượng, ngay cả những đối tượng phức tạp, mà không cần ghép nối với các lớp cụ thể của chúng.

Tất cả các lớp prototype phải có một giao diện chung để có thể sao chép các đối tượng ngay cả khi các lớp cụ thể của chúng là không xác định. Các đối tượng prototype có thể tạo ra các bản sao đầy đủ vì các đối tượng của cùng một lớp có thể truy cập vào các trường riêng tư của nhau.

Cách sử dụng mẫu

Sử dụng: Mẫu Prototype có sẵn trong C# với giao diện có thể sao chép Cloneable.

Nhận biết: Prototype có thể dễ dàng nhận ra bằng phương thức clone hoặc copy, v.v.

Chương trình minh họa

Ví dụ này minh họa cấu trúc của mẫu thiết kế Prototype. Nó tập trung vào việc trả lời những câu hỏi sau:

  • Nó bao gồm những lớp nào?
  • Các lớp này có vai trò gì?
  • Các thành phần của mẫu có liên quan với nhau theo cách nào?

Program.cs

using System;
namespace DesignPatterns.Prototype.Conceptual
{
    public class Person
    {
        public int Age;
        public DateTime BirthDate;
        public string Name;
        public IdInfo IdInfo;
        public Person ShallowCopy()
        {
            return (Person) this.MemberwiseClone();
        }
        public Person DeepCopy()
        {
            Person clone = (Person) this.MemberwiseClone();
            clone.IdInfo = new IdInfo(IdInfo.IdNumber);
            clone.Name = String.Copy(Name);
            return clone;
        }
    }
    public class IdInfo
    {
        public int IdNumber;
        public IdInfo(int idNumber)
        {
            this.IdNumber = idNumber;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Age = 42;
            p1.BirthDate = Convert.ToDateTime("1977-01-01");
            p1.Name = "Jack Daniels";
            p1.IdInfo = new IdInfo(666);
            // Thực hiện shallow copy (sao chép nông) của p1 và gán cho p2.
            Person p2 = p1.ShallowCopy();
            // Tạo môt deep copy (sao chép sâu) của p1 và gán cho p3.
            Person p3 = p1.DeepCopy();
            // Hiển thị giá trị của p1, p2 và p3.
            Console.WriteLine("Original values of p1, p2, p3:");
            Console.WriteLine("   p1 instance values: ");
            DisplayValues(p1);
            Console.WriteLine("   p2 instance values:");
            DisplayValues(p2);
            Console.WriteLine("   p3 instance values:");
            DisplayValues(p3);
            // Thay đổi giá trị thuộc tính của p1 và hiển thị các giá trị của p1,
            // p2 và p3.
            p1.Age = 32;
            p1.BirthDate = Convert.ToDateTime("1900-01-01");
            p1.Name = "Frank";
            p1.IdInfo.IdNumber = 7878;
            Console.WriteLine("\nValues of p1, p2 and p3 after changes to p1:");
            Console.WriteLine("   p1 instance values: ");
            DisplayValues(p1);
            Console.WriteLine("   p2 instance values (reference values have changed):");
            DisplayValues(p2);
            Console.WriteLine("   p3 instance values (everything was kept the same):");
            DisplayValues(p3);
        }
        public static void DisplayValues(Person p)
        {
            Console.WriteLine("      Name: {0:s}, Age: {1:d}, BirthDate: {2:MM/dd/yy}",
                p.Name, p.Age, p.BirthDate);
            Console.WriteLine("      ID#: {0:d}", p.IdInfo.IdNumber);
        }
    }
}

Kết quả:

Original values of p1, p2, p3:
   p1 instance values: 
      Name: Jack Daniels, Age: 42, BirthDate: 01/01/77
      ID#: 666
   p2 instance values:
      Name: Jack Daniels, Age: 42, BirthDate: 01/01/77
      ID#: 666
   p3 instance values:
      Name: Jack Daniels, Age: 42, BirthDate: 01/01/77
      ID#: 666
Values of p1, p2 and p3 after changes to p1:
   p1 instance values: 
      Name: Frank, Age: 32, BirthDate: 01/01/00
      ID#: 7878
   p2 instance values (reference values have changed):
      Name: Jack Daniels, Age: 42, BirthDate: 01/01/77
      ID#: 7878
   p3 instance values (everything was kept the same):
      Name: Jack Daniels, Age: 42, BirthDate: 01/01/77
      ID#: 666

Đã đăng vào

trong

,

bởi

Thẻ:

Bình luận

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *