Օբյեկտների ավազան (նախագծման ձևանմուշ)

Օբյեկտների ավազանը ծրագրային ապահովման ստեղծող ձևանմուշ է, որն ինիցալիազացված օբյեկտներն ըստ պահանջի չի վերացնում, այլ դրանք պահում է «ավազանում»՝ պատրաստ հետագա օգտագործման համար։ Հայցողը ավազանից հայցում է օբյեկտը և վերադարձված օբյեկտի նկատմամբ իրագործում է անհրաժեշտ գործողությունները։ Երբ հայցողն իր աշխատանքն ավարտում է, օբյեկտը չի ոչնչացվում, այլ վերադարձվում է ավազան։
Օբյեկտների ավազաններն հիմնականում օգտագործում են ծրագրի էֆեկտիվության նպատակով։ Որոշ դեպքերում, այն զգալիորեն բարձրացնում է ծրագրի աշխատանքի էֆեկտիվությունը։ Օբյկետների կյանքի տևողությունն այս դեպքում հաշվելը բարդ է, քանի որ օբյեկտները իրականում չեն ստեղծվում և ոչնչացվում, այլ վերցվում են ավազանից և այնտեղ էլ վերադարձվում։


== Ընդհանուր հասկացողություններ ==
Client - հայցող
Instance - նմուշ
Implementation - իրականացում
Product - արգասիք


== Նկարագրություն ==
Ծրարգրի աշխատանքի արդյունավետությունը շատ ցածր կլինի, եթե ծրագրին անհրաժեշտ է աշխատել մեծ քանակի օբյեկտների հետո, որոնց նմուշների ստեղծումը աշխատատար է և նմուշներն էլ իրենց հերթին շատ կարճ ժամանակահատվածում են անհրաժեշտ։ Այս դեպքերի համար էլ ցանկալի է կիրառել օբյեկտների ավազանը։
Օբյեկտների ավազան նախագծման ձևանմուշը ստեղծում է օբյեկտների բազմություն, որոնք կարող են վերաօգտագործվել։ Երբ նոր օբյեկտ է անհրաժեշտ լինում, այն վերցվում է ավազանից։ Եթե անհրաժեշտ օբյեկտն արդեն գոյություն ունի, այն անմիջապես վերադարձվում է, որի արդյունքում էլ խուսափում ենք նմուշի ստեղծման վրա ծախսվող ժամանակից։ Եթե օբյեկտը չկա ավազանում, ապա այն ստեղծվում է և վերադարձվում։ Երբ օբյեկտն օգտագործվել է և այլևս անհրաժեշտ չէ, այն կրկին վերադարձվում է ավազան հետագա օգտագործման և ստեղծման ժամանակի խնայման նպատակով։ Հատկանշական է նշել, որ երբ նմուշը օգտագործվում և վերադարձվում է, գոյություն ունեցող հղումները դառնում են չգործող (անգլ.՝ invalid)։
Որոշ ավազանների մոտ օբյեկտների ռեսուրսները սահմանափակ են, դրա համար էլ տրվում է մաքսիմում օբյեկտների քանակը։ Եթե հայցվող օբյեկտների թիվը հասնում է մաքսիմումին, ծրագիրը կարող է exception գցի, կամ հոսքը անգլ.՝ thread կբլոկավորվի, մինչև նախկին օբյեկտներից մեկը ավազան վերադառնա։
Օբյեկտների ավազան նախագծման ձևանմուշը մի քանի տեղ օգտագործվում է .NET framework-ի ստանդարտ դասերում։ Նմանատիպ օրինակ է հանդիսանում .NET Framework-ի SQL Server-ի Data Provider-ը։ Այստեղ օբյեկտների ավազանն օգտագործվում է, քանի որ SQL Server-ի տվյալների բազայի հետ կապը կարող է դանդաղ լինել։ SQL Server-ի կապի փակման դեպքում իրականում կապը դեպի հղվող օբյեկտ չի վերանում։ Դրա փոխարեն կապը տեղափոխվում է ավազան և հաջորդ կանչի ժամանակ այն դուրս է բերվում ավազանից։ Այս մեթոդն էապես արագացնում է կապի արագությունը։


== Առավելություններ ==
Օբյեկտների ավազանի շնորհիվ կարելի է զգալիորեն բարձրացնել արտադրողականությունը, երբ դասի նմուշի ինիցիալիզացիան կամ նրա վերացումը ժամանակատար են։ Այս դեպքում օբյեկտները հաճախակի մտնում են վերաշրջանառման մեջ և նրանցից ամեն մեկն էապես կտնտեսի ռեսուրսների հատկացման կամ վերացման վրա ծախսվող ժամանակը։ Օբյեկտների ավազանը ռեսուրսներ է պահանջում, որպիսիք են օրինակ հիշողությունը, որոշ դեպքերում ցանցային սոկետները անգլ.՝ network socket: Այդ առումով լավ կլինի ունենալ մինիմալ քանակությամբ օգտագործվող ձևանմուշներ։ Սակայն վերջինս պարտադիր պայման չի հանդիսանում։
Օբյեկտների ավազանն հասնում է կանխատեսելի ժամանակին, երբ նոր օբյեկտների (հատկապես ցանցային) ստեղծման ժամանակը դառնում է փոփոխական։ Այս առավելությունն հիմնականում վերաբերվում է այն օբյեկտներին, որոնց ստեղծումը ժամանակատար է՝ հատկապես տվայալների բազաների, սոկետների միացումներին, հոսքերին (անգլ.՝ thread) և մեծ գրաֆիկական օբյեկտների համար՝ ինչպիսիք են օրինակ շրիֆտները և ռաստրային պատկերները։
Պարզ օբյեկտների օգտագործումը ավազաններում, որոնք օրինակ ստեղծման համար ժամանակատար չեն, այլ լոկ հիշողության ռեսուրս են խլում, էֆեկտիվ չէ, քանի որ այն կարող է բերել արտադրողականության իջեցմանը։ Այս դեպքում ավելի նպատակահարմար է օգտագործել հիշողության ավազանը, որի խնդիրն է հիշողության ծախսերը բերել մինիմումի կամ ազատել։


== Իրականացում ==
Օբյեկտների ավազանը կարող է իրականացվել ձեռքով՝ ֆաբրիկայից օբյեկտի բացահայտ հայցման և օբյեկտի վերադարձը կարգավորող ձևանմուշի (անգլ.՝ dispose pattern) օգնությամբ։ Բացի այդ, աղբ-հավաքող լեզուներում, օբյեկտների ավազանը դասի համար կարող է իրականացվել ավտոմատ կերպով։


== Օրինակ C# լեզվով ==
.NET-ի Base Class Library-ում կան մի քանի օբյեկտներ, որոնք իրականացված են այս ձևանմուշով։ System.Threading.ThreadPool-ն այնպես է կոնֆիգուրացված, որպեսզի բաշխումն իրականացնելու համար ունենա կոնկրետ հոսքերի անգլ.՝ thread քանակ։ Երբ հոսքերը վերադարձվեն, նրանք կկարողանան այլ աշխատանքներ կատարել։ Այսպիսով կարելի է օգտագործել հոսքերը՝ նրանց ստեղծման և ջնջման վրա ռեսուրս չծախսելով։
Ներքևում C # լեզվով բերված է օբյեկտների ավազան ձևանմուշի իրականացումը։ Կարճության համար դասի հատկանիշները անգլ.՝ property հայտարարվել են C# 3.0 automatically implemented property syntax-ի միջոցով։ Լեզվի հին տարբերակների համար դրանք պետք է փոխարինել լրիվ իրականցման կոդերով։
Ավազանն այստեղ ցույց է տրված ստատիկ դասի տեսքով, ինչքան էլ որ այն անսովոր լինի բազմաթիվ ավազանների համար։

Բերված ծրագրային կոդում PooledObject-ն իր մեջ երկու հատկություն է ներառում, որը չի պատկերված UML դիագրամայում։ Առաջինը դա օբեյկտի առաջին անգամվա ստեղծման ժամանակն է։ Երկրորդը տվյալ է պահում, որը կարող է փոփոխվել հայցողի կողմից, երբ PooledObject օբյեկտը վերադարձվում է ավազան։ Իրականում այդ դաշտը տվյալ է պահում, որ օբյեկտը ազատ է, թե՝ ոչ, որը պետք է գալիս օբյեկտի հայցման ժամանակ։


== Ծանոթագրություններ ==