C# 디자인 패턴 - 생성 패턴의 프로토타입 패턴

개요

프로토타입 패턴은 코드가 속한 클래스에 종속되지 않고 기존 객체를 복사할 수 있는 생성적 디자인 패턴입니다. 매번 새로 생성하는 것이 아니라 프로토타입 패턴을 통해 기존 객체를 복사하여 새로운 객체를 얻을 수 있습니다.

프로토타입 모드에는 다음 역할이 포함됩니다.

  1. 추상 프로토타입 클래스: 특정 프로토타입 객체가 구현해야 하는 clone() 메서드를 지정합니다.
  2. 구상 프로토타입 클래스: 복사 가능한 객체인 추상 프로토타입 클래스의 clone() 메서드를 구현합니다.
  3. 액세스 클래스: 구체적인 프로토타입 클래스의 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());

 요약하다

프로토타입 패턴의 장점:

  1. 프로토타입 모드는 클래스의 생성자를 호출하지 않고 메모리의 객체를 복사하며 성능이 뛰어납니다.
  2. 단순화된 생성 과정. 클래스 초기화가 많은 리소스를 소비하는 경우 프로토타입을 복사하여 반복되는 초기화 프로세스를 피할 수 있습니다.
  3. 생성자 제약 조건을 피할 수 있습니다. 기존 인스턴스를 복사하면 기존 인스턴스의 데이터를 보존하는 데 효과적입니다.
  4. 제품 카테고리를 추가하거나 빼는 것은 매우 편리합니다. 작성자의 변경으로 인해 클라이언트가 변경될 필요는 없습니다.

프로토타입 패턴의 단점:

  1. 각 클래스는 복제 메소드로 구성되어야 합니다.
  2. clone 메소드는 클래스 내부에 위치하는데, 기존 클래스를 수정하는 경우 코드를 수정해야 하므로 열기 및 닫기 원칙에 위배됩니다.
  3. Deep Copy를 구현하려면 더 복잡한 코드를 작성해야 하며, 객체 간에 중첩된 참조가 여러 개 있는 경우 Deep Copy를 구현하려면 각 계층에서 Deep Copy 구현 방법을 제공해야 합니다.
  4. 복제된 객체의 정확성은 특히 런타임 시 상태가 변경되는 경우 유지되어야 합니다.

 

추천

출처blog.csdn.net/weixin_65243968/article/details/132469635