วิธีใช้รูปแบบการออกแบบต้นแบบใน. NET

รูปแบบการออกแบบใช้เพื่อแก้ปัญหาที่เกิดขึ้นประจำและความซับซ้อนในการพัฒนาซอฟต์แวร์ รูปแบบต้นแบบอยู่ในหมวดหมู่รูปแบบการออกแบบสร้างสรรค์และใช้ในการสร้างโคลนของวัตถุ รูปแบบการออกแบบที่สร้างสรรค์เกี่ยวข้องกับการสร้างวัตถุและการจัดการกระบวนการสร้างวัตถุในแอปพลิเคชันของคุณ ตัวอย่างทั่วไปของรูปแบบการออกแบบที่อยู่ภายใต้หมวดหมู่รูปแบบการสร้างสรรค์ ได้แก่ โรงงานนามธรรมตัวสร้างวิธีการโรงงานต้นแบบและรูปแบบซิงเกิลตัน

รูปแบบการออกแบบต้นแบบช่วยให้คุณสามารถสร้างอินสแตนซ์ใหม่ของคลาสจากอินสแตนซ์ที่มีอยู่ คุณสามารถใช้ประโยชน์จากรูปแบบการออกแบบนี้เพื่อสร้างโคลนของวัตถุเมื่อกระบวนการสร้างวัตถุนั้นเป็นเรื่องที่ต้องเสียค่าใช้จ่าย โปรดทราบว่าการโคลนถูกกำหนดให้เป็นกระบวนการสร้างสำเนาของวัตถุ การโคลนนิ่งมีสองประเภท: สำเนาลึกและสำเนาตื้น

สำเนาตื้นเทียบกับการโคลนสำเนาลึก

การคัดลอกแบบตื้นจะดำเนินการโดยใช้เมธอด Object.MemberwiseClone และคัดลอกฟิลด์ที่ไม่คงที่ของอ็อบเจ็กต์ในขณะที่สำเนาแบบลึกจะใช้เพื่อคัดลอกทั้งประเภทการอ้างอิงและค่าและให้อินสแตนซ์ที่แตกต่างกันของอ็อบเจ็กต์ คุณสามารถเรียนรู้เพิ่มเติมสำเนาลึกและสำเนาตื้นจากบทความของฉันที่นี่

ผู้เข้าร่วม (คลาสและออบเจ็กต์) ในการใช้งานรูปแบบต้นแบบโดยทั่วไปมีดังต่อไปนี้:

  • Prototype - กำหนดอินเทอร์เฟซสำหรับการโคลนตัวเอง
  • ConcretePrototype - กำหนดประเภทที่ใช้การดำเนินการสำหรับการโคลนตัวเอง
  • ไคลเอนต์ - สิ่งนี้กำหนดผู้บริโภคที่สามารถสร้างอินสแตนซ์ใหม่ได้โดยการโคลนต้นแบบ

โปรดจำไว้ว่าเราจะใช้รูปแบบต้นแบบที่นี่โดยใช้สามประเภท ซึ่งรวมถึงสิ่งต่อไปนี้:

  • ลูกค้า
  • CustomerManager
  • CustomerPrototype

สร้างคลาสนามธรรมต้นแบบใน. NET

อ้างถึงคลาส CustomerPrototype ที่ระบุด้านล่าง

[ต่อเนื่อง ()]

CustomerPrototype ระดับนามธรรมสาธารณะ

    {

        CustomerPrototype ที่เป็นนามธรรมสาธารณะ (bool performDeepCopy);

    }

คลาส CustomerPrototype มีลักษณะเป็นนามธรรมและมีวิธีนามธรรมที่ชื่อว่า Clone วิธีนี้ยอมรับพารามิเตอร์บูลีนชื่อ performDeepCopy หากพารามิเตอร์ส่งผ่านไปเป็นจริงพารามิเตอร์จะทำการคัดลอกแบบลึกสำเนาตื้นไม่เช่นนั้น

สร้างคลาสต้นแบบคอนกรีตใน. NET

คลาส CustomerManager จะได้รับถัดไป มีพจนานุกรมที่เก็บอินสแตนซ์ของคลาสลูกค้า (เป็นเพียงคลาส POCO อื่น) อยู่ภายใน นอกจากนี้ยังมีตัวสร้างดัชนีชื่อ CustomerPrototype คุณสมบัติชุดของตัวทำดัชนีถูกใช้เพื่อเก็บข้อมูลลงในอินสแตนซ์พจนานุกรมที่ชื่อลูกค้า

  CustomerManager ระดับสาธารณะ

    {

     ลูกค้าพจนานุกรมส่วนตัว = พจนานุกรมใหม่ ();

        CustomerPrototype สาธารณะนี้ [ดัชนี int]

        {

            รับ {กลับลูกค้า [ดัชนี]; }

            ตั้งค่า {customers.Add (ดัชนีค่า); }

        }

    }

สร้างคลาสไคลเอนต์ต้นแบบใน. NET

คลาสลูกค้าจะได้รับถัดไป ประกอบด้วยคุณสมบัติสองอย่าง ได้แก่ FirstName และ LastName และสองวิธีคือ Clone และ DeepCopy

[ต่อเนื่อง ()]

    ลูกค้าระดับสาธารณะ: CustomerPrototype

    {

        สตริงสาธารณะ FirstName

        {

            รับ;

        }

        สตริงสาธารณะ LastName

        {

            รับ; ชุด;

        }

        สาธารณะแทนที่ CustomerPrototype Clone (บูล deepClone)

        {

            สวิตช์ (deepClone)

            {

                กรณีจริง:

                    ส่งคืน this.DeepCopy (this) เป็น CustomerPrototype;

                กรณีเท็จ:

                    ส่งคืนสิ่งนี้ MemberwiseClone () เป็น CustomerPrototype;

                ค่าเริ่มต้น:

                    ส่งคืนสิ่งนี้ MemberwiseClone () เป็น CustomerPrototype;

            }

        }

        T DeepCopy ส่วนตัว (T obj)

        {

           // เขียนโค้ดที่นี่เพื่อทำการคัดลอกแบบลึก

        }

     }

ฉันได้ข้ามซอร์สโค้ดของวิธี DeepCopy ในรายการโค้ดด้านบนเนื่องจากมีอยู่แล้วในบทความก่อนหน้าของฉันที่นี่

สร้างสำเนาลึกของวัตถุใน. NET

ข้อมูลโค้ดต่อไปนี้แสดงให้เห็นว่าคุณสามารถใช้ประโยชน์จากคลาส CustomerManager ที่เราสร้างไว้ก่อนหน้านี้เพื่อทำสำเนาแบบลึกได้อย่างไร

CustomerManager customerManager = CustomerManager ใหม่ ();

ลูกค้า custObj1 = ลูกค้าใหม่ ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "กันจิลาล";

customerManager [0] = custObj1;

ลูกค้า custObj2 = ลูกค้าใหม่ ();

custObj2.FirstName = "สตีเฟน";

custObj2.LastName = "สมิ ธ ";

customerManager [1] = custObj2;

Customer customer = customerManager [0] .Clone (true) as Customer;

โปรดทราบว่าเราได้ส่ง "true" เป็นพารามิเตอร์ไปยังเมธอด Clone เพื่อทำสำเนาแบบลึก

สร้างสำเนาตื้นของวัตถุใน. NET

ในทำนองเดียวกันคุณสามารถส่ง "เท็จ" เป็นพารามิเตอร์ไปยังวิธีการเดียวกันเพื่อดำเนินการคัดลอกแบบตื้น นี่คือวิธีที่คุณจะบรรลุเป้าหมายนี้

ลูกค้าของลูกค้า = customerManager [0] .Clone (false) เป็นลูกค้า;

สุดท้ายนี่คือรหัสที่สมบูรณ์ของวิธีการหลักสำหรับการอ้างอิงของคุณ

โมฆะคงที่หลัก (สตริง [] args)

      {

      CustomerManager customerManager = CustomerManager ใหม่ ();

      ลูกค้า custObj1 = ลูกค้าใหม่ ();

      custObj1.FirstName = "Joydip";

      custObj1.LastName = "กันจิลาล";

      customerManager [0] = custObj1;

      ลูกค้า custObj2 = ลูกค้าใหม่ ();

      custObj2.FirstName = "สตีเฟน";

      custObj2.LastName = "สมิ ธ ";

      customerManager [1] = custObj2;

      Customer customer = customerManager [0] .Clone (true) as Customer;

      Console.ReadKey ();

      }