כיצד להשתמש בתבנית עיצוב בריכת האובייקטים ב- C #

בעת בניית יישומים, לעתים קרובות אתה נתקל באובייקטים די יקר ליצור. בתרחישים מסוימים, עלות יצירת אובייקטים חדשים גבוהה מספיק כדי להשפיע על ביצועי היישומים. כאן המקום להציל את תבנית עיצוב בריכת האובייקטים. 

דפוס עיצוב בריכת האובייקטים הוא דפוס עיצוב יצירתי המשמש למיחזור אובייקטים במקום לשחזר אותם בכל פעם שהיישום זקוק להם. על ידי שמירה על מקרים רב-פעמיים של אובייקטים במאגר משאבים, ומסירתם לפי הצורך, דפוס זה עוזר למזער את התקורה של אתחול, יישור וסילוק אובייקטים ולהגברת ביצועי היישום שלך.

כאשר היישום מבקש אובייקט, והאובייקט זמין מהמאגר, הוא מוחזר מהמאגר. אם האובייקט מהסוג המבוקש אינו זמין מהמאגר, נוצר ומוחזר מופע חדש של האובייקט. כאשר היישום כבר לא זקוק לאובייקט, האובייקט נשלח חזרה לבריכה.

ניתן להגדיר את המספר המינימלי והמקסימלי של אובייקטים שמאגר אובייקטים יכול להכיל. אם היישום זקוק לאובייקט מהמאגר אך הוקצה המספר המרבי של אובייקטים, יישום מאגר אובייקטים מותאם אישית אופייני יכול לאמץ אחת או יותר מהאסטרטגיות הבאות:

  1. החזר null או השליך חריג
  2. חסום את השיחה עד שיהיה חפץ זמין
  3. הגדל את גודל הבריכה כדי להכיל יותר אובייקטים

מאגר עצמים דומה למאגר חיבורי מסד הנתונים. כשם שמאגר החיבורים שולט במספר החיבורים המרבי למסד הנתונים, מאגר האובייקטים שולט במספר מופעי המחלקה שבהם ישתמש היישום.

יצירת מאגר עצמים כללי ב- C #

עכשיו שאנחנו יודעים את היסודות, בואו נקפוץ ליישום. בעת יישום דפוס עיצוב בריכת האובייקטים, עלינו לשקול שימוש חוזר, פשטות, יכולת תצורה ואפילו גורמים כגון בטיחות חוטים.

בדוגמה זו ננצל ConcurrentBag מחלקה לאחסון חפצים. שים לב ConcurrentBagבכיתה ב System.Collections.Concurrentהמרחב מספקת אוסף חינם נעילה, חוט בטוח, לא מסודר של אלמנטים. שים לב גם שההחדרה וההסרה של חפצים אל וממנו ConcurrentBagמהירים מאוד - במיוחד אם אותו חוט מנסה להכניס ולהסיר פריטים מהאוסף בו זמנית.

הנה מבנה ObjectPoolהכיתה המותאמת אישית שלנו . שים לב לשימוש ConcurrentBagבמופע לאחסון האובייקטים.

class class ObjectPool בו T: new ()

    {

        פריטי ConcurrentBag קריאה וקריאה פרטית = ConcurrentBag חדש ();

        מונה אינטר פרטי: 0;

        פרטי int MAX = 10;

        שחרור חלל ציבורי (פריט T)

        {

            //לעשות          

        }

        ציבורי T Get ()

        {

           //לעשות

        }

    }

קטע הקוד הבא ממחיש יישום של Getהשיטה. Getהשיטה מחזירה מופע ממאגר האובייקט אם זמינה. אם אין זמין, אובייקט חדש נוצר ומחזיר אותו. בשני התרחישים הללו, counterהמשתנה מוגדל או יורד לפי הצורך. שים לב כי מכיוון שאנו משתמשים באוסף מקביל, כלומר ConcurrentBagבדוגמה זו, מטפלים במקביליות.

ציבורי T Get ()

        {

            פריט T;

            if (פריטים. TryTake (פריט החוצה))

            {

                דֶלְפֵּק-;

                פריט החזר;

            }

            אַחֵר

            {

                T obj = T חדש ();

                פריטים.הוסף (obj);

                מונה ++;

                החזר אובייקט;

            }

        }

MAXמשתנים השלם הוא בקידוד קשיח כאן, אבל אתה יכול לעשות את זה להגדרה. שיעור זה אינו אטום או סטטי, כך שתוכל להאריך אותו כרצונך.

Releaseהשיטה משמשת לשחרר אובייקטים שאינם נחוצים עוד חזרה לבריכה האובייקט. הוא בודק אם ערך counterהמשתנה נמוך מערך MAXהמשתנה, ואם כן, מוסיף את האובייקט שהועבר אליו כפרמטר לאוסף.

שחרור חלל ציבורי (פריט T)

        {

            אם (מונה <MAX)

            {

                פריטים.הוסף (פריט);

                מונה ++;

            }           

        }

בהנחה שיצרת מחלקה שנקראת MyClass, כך תוכל להוסיף אותה למאגר האובייקטים באמצעות ObjectPoolהמחלקה.

ריק סטטי ראשי (מחרוזת [] טענות)

        {

            ObjectPool objPool = ObjectPool חדש ();

            MyClass obj = objPool.Get ();

            objPool.Release (obj);

            Console.Read ();

        }

באפשרותך לשנות יישום מאגר אובייקטים מותאם אישית זה כדי לאפשר קריאה בגודל המינימלי והמקסימלי של המאגר מקובץ תצורה. כחלק מאתחול של מאגר האובייקטים, תוכלו גם להבטיח שהמאגר מכיל את המספר המינימלי של אובייקטים בו.

מאגרי אובייקטים מסייעים להפחתת תקורה של משאבים כאשר אתה זקוק למספר מופעים של מחלקה שהם יקרים ליצור או לניהול. אם היישום שלך כולל הפעלת אותם שיעורים שוב ושוב, השתמש בתבנית עיצוב זו כדי להבטיח ביצועים אופטימליים.