Ֆաբրիկային մեթոդ (նախագծման ձևանմուշ)

Ֆաբրիկային մեթոդը նախագծման ստեղծող ձևանմուշ է, որն օգտագործում է ֆաբրիկային մեթոդներ, որպեսզի լուծի օբյեկտի ստեղծման խնդիրը՝ չնշելով ճշգրիտ օբյեկտի դասը։ Սա իրագործվում է օբյեկտի ստեղծման ժամանակ ֆաբրիկային մեթոդ կանչելով և բազային դասում դուստր-դասերի իրականացմամբ։ Այլ խոսքերով ասած, ֆաբրիկան օբյեկտների ստեղծումն իրագործում է ծնողական դասից ժառնգման մեթոդով։ Դա թույլ է տալիս ծրագրային կոդում օգտագործել ոչ սպեցիֆիկ դասեր և աբստրակտ օբյեկտների միջև մանիպուլյացիա կատարել ավելի բարձր մակարդակի վրա։


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


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


== Կառուցվածք ==


== Օրինակներ ==


=== C# ===
Ֆաբրիկային մեթոդը գործ ունի օբյեկտի նմուշի հետ առանց հետաքրքվելու նմուշի ստեղծման տրամաբանության մեջ։ Այլ խոսքերով ասած Ֆաբրիկան փաստացի համարվում է ընդհանուր ինտերֆեյս ունեցող օբյեկտի ստեղծողը։

Վերը բերված կոդում կարող եք տեսնել IPeople անվանմամբ մի ինտերֆեյսի ստեղծման օրինակ և նրա միջոցով Villagers և CityPeople երկու դասերի իրականացում։ Կախված թե ինչ տիպ ենք փոխանցել ֆաբրիկային օբյեկտին, մենք հետ կստանանք կոնկրետ տիպի օբյեկտ որպես IPeople ինտերֆեյս։
Ֆաբրիկային մեթոդը դա պարզապես Factory դասի հավելումն է։ Այն օբյեկտ է ստեղծում դասի ինտերֆեյսի միջոցով, բայց մյուս կողմից ենթադասերին թույլ է տալիս, որ իրենք որոշեն, թե ինչ դասից պետք է նմուշը վերցվի։

Դուք կարող եք տեսնե, որլ GetObject-ը օգտագործվում է ConcreteFactory-ում։ Արդյունքում նրանից հեշտությամբ կարելի է կանչել DoSomething () ֆունկցիան, որպեսզի IProduct-ը ստանանք։ Դուք նույնպես կարող եք ձեր լոգիկան գրել կոնկրետ Factory Method-ից ձեր օբյեկտը ստանալու համար։ GetObject-ը Factory ինտերֆեյսում դառնում է աբստրակտ։


== Սահմանափակումներ ==
Ֆաբրիկային մեթոդի օգտագործման հետ գոյություն ունի երեք սահմանափակում։ Առաջինը վերաբերվում է կոդի վերակազմակերպմանը (անգլ.՝ refactoring), իսկ մյուս երկուսը կոդի ընդարձակմանը։

Առաջինի սահմանափակում նրանում է, որ գոյություն ունեցող դասը, ֆաբրիկաների օգտագործման համար վերակազմակերպման ենթարկելիս, կտրում է (անգլ.՝ breaks) հայցողներից (անգլ.՝ clients)։ Օրինակ, եթե Complex դասը ստանդարտ դաս է, ապա այն ունի բազմաթիվ հայցողներ հետևյալ տեսքով.
Այն բանից հետո, երբ մենք հասկանում ենք, որ անհրաժեշտ է երկու տարբեր ֆաբրիկաներ, մենք փոփոխում ենք դասը։ Բայց քանի որ կոնստրուկտորն արդեն մասնավոր է, հաճախորդի գոյություն ունեցող կոդը այլևս կոմպիլյացիայի չի ենթարկվում։

Երկրորդ սահմանափակումը նրանում է, որ դասը հնարավոր չէ ընդարձակել, քանի որ նախագծման մոդելը հիմնված է փակ (անգլ.՝ private) կոնստրուկտոր օգտագործելու վրա։ Ամեն մի ենթադաս պետք է կանչի ժառանգ կոնստրուկտորին, բայց դա հնարավոր չէ իրականացնել, քանի որ կոնստրուկտորը փակ է։
Երրորդ սահմանափակումը նրանումն է, որ եթե դասը ընդարձակվել է (օրինակ եթե կոնստրուկտորը պաշտպանված է հայտարարած), ենթադասը պետք է բոլոր ֆաբրիկաների համար տա իր սեփական վերաիրականացումը (անգլ.՝ re-implementation)։ Օրինակ, եթե StrangeComplex դասը Complex դասի ընդարփակումն է, ապա StrangeComplex դասը պետք է բոլոր ֆաբրիկաների համար ունենա իր սեփական տարբերակը։ կոդի կանչը կտա Complex (սուպերդաս) նմուշ, բայց ոչ թե սպասված ենթադասի նմուշ։ Որոշ ծրագրավորման լեզուներ, իրենց յուրահատկություններից ելնելով, կարող են խուսափել այս խնդրից։
Բոլոր երեք խնդիրները կարելի է լուծել ծրարգրավորման լեզվի փոփոխմամբ, որտեղ հնարավոր կլինի առաջին-դասի ֆաբրիկաները դարձնել դասի անդամներ (անգլ.՝ members)։


== Կիրառություններ ==
ADO.NET, IDbCommand.CreateParameter; Ֆաբրիկան կիրառվում է զուգահեռ դասի հիերարխիային միանալու համար։
Qt, QMainWindow::createPopupMenu Ֆաբրիկայի մեթոդը կիրառվում է framework-ում, որտեղ ենթադրվում է, որ ծրագրի կոդը կարող է փոխարինվի այլ կոդով։
Java, մի քանի ֆաբրիկաներ են օգտագործվում javax.xml.parsers փաթեթում։ Օրինակ javax.xml.փարսերներ .DocumentBuilderFactory կամ javax.xml.փարսերներ.SAXParserFactory.


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