วิธีใช้รูปแบบการออกแบบพูลวัตถุใน C #

เมื่อสร้างแอปพลิเคชันคุณมักจะเจอวัตถุที่มีราคาค่อนข้างแพงในการสร้าง ในบางสถานการณ์ต้นทุนในการสร้างออบเจ็กต์ใหม่จะสูงพอที่จะส่งผลกระทบต่อประสิทธิภาพของแอปพลิเคชัน นี่คือที่มาของรูปแบบการออกแบบ object pool เพื่อช่วยเหลือ 

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

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

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

  1. คืนค่าว่างหรือโยนข้อยกเว้น
  2. บล็อกการโทรจนกว่าวัตถุจะพร้อมใช้งาน
  3. เพิ่มขนาดพูลเพื่อรองรับวัตถุเพิ่มเติม

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

การสร้างพูลออบเจ็กต์ทั่วไปใน C #

ตอนนี้เรารู้พื้นฐานแล้วเรามาดูการใช้งานกันเลย เมื่อใช้รูปแบบการออกแบบ object pool เราจำเป็นต้องพิจารณาถึงความสามารถในการใช้ซ้ำความเรียบง่ายความสามารถในการกำหนดค่าและแม้แต่ปัจจัยต่างๆเช่นความปลอดภัยของเธรด

ในตัวอย่างนี้เราจะใช้ประโยชน์จากConcurrentBag คลาสเพื่อเก็บอ็อบเจกต์ โปรดสังเกตว่าConcurrentBagคลาสในSystem.Collections.Concurrentเนมสเปซจัดเตรียมคอลเลกชันองค์ประกอบที่ไม่มีการล็อกปลอดภัยเธรด นอกจากนี้โปรดทราบว่าการแทรกและการลบวัตถุเข้าและออกConcurrentBagนั้นรวดเร็วมากโดยเฉพาะอย่างยิ่งหากเธรดเดียวกันพยายามแทรกและลบรายการออกจากคอลเลกชันในเวลาเดียวกัน

นี่คือโครงสร้างของObjectPoolคลาสแบบกำหนดเองของเรา สังเกตการใช้งานConcurrentBagอินสแตนซ์ในการจัดเก็บวัตถุ

คลาสสาธารณะ ObjectPool โดยที่ T: new ()

    {

        รายการ ConcurrentBag แบบอ่านอย่างเดียวส่วนตัว = ConcurrentBag ใหม่ ();

        ตัวนับ int ส่วนตัว = 0;

        int ส่วนตัว MAX = 10;

        การปล่อยโมฆะสาธารณะ (รายการ T)

        {

            //ทำ          

        }

        สาธารณะ T Get ()

        {

           //ทำ

        }

    }

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

สาธารณะ T Get ()

        {

            T รายการ;

            ถ้า (items.TryTake (out item))

            {

                เคาน์เตอร์-;

                สิ่งของที่คืน;

            }

            อื่น

            {

                T obj = ใหม่ T ();

                รายการเพิ่ม (obj);

                เคาน์เตอร์ ++;

                กลับ obj;

            }

        }

MAXตัวแปรจำนวนเต็มยากรหัสที่นี่ แต่คุณสามารถทำให้มันที่กำหนด คลาสนี้ไม่ได้ปิดผนึกหรือคงที่ดังนั้นคุณสามารถขยายได้ตามต้องการ

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

การปล่อยโมฆะสาธารณะ (รายการ T)

        {

            ถ้า (ตัวนับ <MAX)

            {

                items.Add (รายการ);

                เคาน์เตอร์ ++;

            }           

        }

สมมติว่าคุณได้สร้างคลาสที่เรียกว่าMyClassนี่คือวิธีที่คุณสามารถเพิ่มลงในพูลออบเจ็กต์โดยใช้ObjectPoolคลาส

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

        {

            ObjectPool objPool = ObjectPool ใหม่ ();

            MyClass obj = objPool.Get ();

            objPool.Release (obj);

            Console.Read ();

        }

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

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