Nội dung
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
Để lại một bình luận