개요
프로토타입 패턴은 코드가 속한 클래스에 종속되지 않고 기존 객체를 복사할 수 있는 생성적 디자인 패턴입니다. 매번 새로 생성하는 것이 아니라 프로토타입 패턴을 통해 기존 객체를 복사하여 새로운 객체를 얻을 수 있습니다.
프로토타입 모드에는 다음 역할이 포함됩니다.
- 추상 프로토타입 클래스: 특정 프로토타입 객체가 구현해야 하는 clone() 메서드를 지정합니다.
- 구상 프로토타입 클래스: 복사 가능한 객체인 추상 프로토타입 클래스의 clone() 메서드를 구현합니다.
- 액세스 클래스: 구체적인 프로토타입 클래스의 clone() 메서드를 사용하여 새 개체를 복사합니다.
사례
인터페이스 소개
public interface IResume
{
//填写资料
void SetPersonInfo(int age, string sex);
//打印资料
void Display();
//克隆方法
object Clone();
}
구체적인 수업
public class Resume : IResume
{
private string name;
private int age;
private string sex;
// 构造函数:初始化姓名
public Resume(string name)
{
this.name = name;
}
// 填写个人信息
public void SetPersonInfo(int age, string sex)
{
this.age = age;
this.sex = sex;
}
//打印
public void Display()
{
Console.WriteLine("姓名:" + name);
Console.WriteLine("年龄:" + age + ",性别:" + sex);
}
// 克隆该实例
public object Clone()
{
return MemberwiseClone() as Resume;
}
}
시험
시뮬레이션은 Ahao의 프로필을 생성하고 이를 객체 B에 복제한 다음 객체 B의 나이를 변경합니다.
public static void Main(string[] args)
{
//创建原型A对象
Resume a = new Resume("阿豪");
a.SetPersonInfo(18, "男");
//克隆给B对象
Resume b = a.Clone() as Resume;
//修改B对象的内容
b.SetPersonInfo(20, "男");
Console.WriteLine("----------------A--------------");
a.Display();
Console.WriteLine("----------------B--------------");
b.Display();
}
복제된 객체를 원본 객체와 비교해 보겠습니다.
// 测试A==B?
// 对任何的对象x,都有x.clone() !=x,即克隆对象与原对象不是同一个对象
Console.Write("A==B ? ");
Console.WriteLine(a == b);
// 对任何的对象x,都有x.clone().GetType()==x.GetType(),即克隆
Console.Write("A.GetType()==B.GetType() ? ");
Console.WriteLine(a.GetType() == b.GetType());
요약하다
프로토타입 패턴의 장점:
- 프로토타입 모드는 클래스의 생성자를 호출하지 않고 메모리의 객체를 복사하며 성능이 뛰어납니다.
- 단순화된 생성 과정. 클래스 초기화가 많은 리소스를 소비하는 경우 프로토타입을 복사하여 반복되는 초기화 프로세스를 피할 수 있습니다.
- 생성자 제약 조건을 피할 수 있습니다. 기존 인스턴스를 복사하면 기존 인스턴스의 데이터를 보존하는 데 효과적입니다.
- 제품 카테고리를 추가하거나 빼는 것은 매우 편리합니다. 작성자의 변경으로 인해 클라이언트가 변경될 필요는 없습니다.
프로토타입 패턴의 단점:
- 각 클래스는 복제 메소드로 구성되어야 합니다.
- clone 메소드는 클래스 내부에 위치하는데, 기존 클래스를 수정하는 경우 코드를 수정해야 하므로 열기 및 닫기 원칙에 위배됩니다.
- Deep Copy를 구현하려면 더 복잡한 코드를 작성해야 하며, 객체 간에 중첩된 참조가 여러 개 있는 경우 Deep Copy를 구현하려면 각 계층에서 Deep Copy 구현 방법을 제공해야 합니다.
- 복제된 객체의 정확성은 특히 런타임 시 상태가 변경되는 경우 유지되어야 합니다.