JavaScript : Factory Pattern

Jahangir Kazimli
4 min readSep 24, 2022

--

Bu məqalə ilə artıq Javascript Design Pattern`lərə giriş etməyə başlayırıq. Obyekt-yönümlü proqramlaşdırma zamanı müxtəlif məqsədlər üçün müxtəlif Design Pattern`lər mövcuddur. Bu məqalədə Factory Pattern haqqında danışacağıq.

Bildiyimiz kimi obyekt yönümlü proqramlaşdırma edərkən , fərqli obyektlər yaratmalı oluruq. Və bəzən eyni tipdə olan fərqli obyektlər yaradırıq. Bir neçə obyekt yaradarkən, bu çox da gözəbatan problem deyil, amma eyni tip obyektləri yaratmaq avtomatlaşdırılmalı olan zaman artıq Factory pattern metodu ilə bunu edə bilərik.

QEYD : Məqaləni başa düşmək üçün , orta-üst səviyyədə OOP biliyiniz olmalıdır.

Başlamadan öncə bu 2 şəklə diqqət yetirək.

Prototype linkage

*JavaScriptdə , Constructor funksiyadan miras alınan obyektlərin prototype hissəsi olur. Və hər object , Object() funskiyasının törəməsidir

Burada nümunə üçün Person constructorumuz var və onun törəməsi olan 2 obyekt. Bu obyektlər , Person constructorunun törəməsidir , Person isə təbii olaraq Object() funksiyasndan inherit olunub və onun prototype hissəsinə access`i var.

Başlayaq

Nümunə olaraq product adlı obyekt yaradaq :

product obyekti

Bu ən sadə tipli bir obyktdir. Bunu bir neçə dəfə yaratmaq çox da problem deyil amma əgər çox yaratmalı olacağıqsa avtomatlaşdırmalıyıq bu işi. Amma bunu edərkən performans mövzusuna da diqqət etməliyik.

Bu obykti yaradacaq bi funksiya yaradaq :

Obykti yaradacaq funksiyanı yazdıq və ən sadə nümunə ilə bir obyekt yaratdıq. Amma iş bununla bitmir. Bura kim məsələ həll olunmuş kimi görünə bilər , amma elə deyil :)

Fikir versək , createProduct funksiyası ilə obyekt yaradarkən onun daxilinə getFullİnfo metodu əlavə olunur. Yəni bu o anlama gəlir ki nə qədər obyekt yaratrsaq, bir o qədər də bu funksiyadan yaratmış olacağıq. Performans cəhətdən istədiyimiz bir şey deyil bu. Həll yolları axtaraq.

Misalçün , getFullİnfo funksiyasını başqa bir obyektin daxilində saxlayıb , crateProduct funskiyası ilə yaradılan obyektlərdən istədiyimizə əlavə edə bilərik :

Burda problem qismən həll oluna bilər amma təbii ki düzgün metod deyil bu. Hər dəfə əllə əlavə edə bilmərik funksiyaları. O zaman başqa yollar axtaraq.

İlk öncə yaratdığımız obyktin prototype hissəsinə baxaq :

Gördüyünüz kimi info funksiyası getFullİnfo funksiyasının referansını alıb, və yeni bir metod kimi obyektin daxilinə yerləşib. Bu da istəyəcəyimiz bir şey deyil. Əgər funksiyanı necəsə obyktin prototype hissəsinə daşıya bilsək daha performanslı olar.

Burada yeni bir obyekt yaratdıq və onun __proto__ dəyəri productExtras obyektinə bərabər etdik. Yəni prototype olaraq productExtras funksiyasını aldıq.

Konsolda obyketimizə baxaq bir daha :

Gördüyümüz kimi artıq getFullİnfo funskiyasını obyektimizin prototype hissəsinə daşıya bildik. Artıq həm obyekti yaradacaq funksiyamız var üstəlik funksiyaları da obyektin prototype hissəsinə əlavə edə bildik. Bura qədər problem üzdə həll olunmuş kimi görünə bilər. AMMA YOX !

Production kodunda __proto__ istifadə edə bilmərik. Obyektin birbaşa __proto__ hissəsinə toxunmaq olmaz !

Demək ki bu metod da işimizə yaramadı. Bizə elə bir yol lazımdır ki , __proto__ hissəsinə toxunmadan bu işi görə bilək. Object.create() metodu ilə bu işi görməyə calışaq.

Burada artıq Object.create metodu ilə ilə yaradılır obyektlər. Nümunə bir obyekt yaradaq :

Və prototype hissəsinə baxaq :

Gördüyümüz kimi artıq həm obyektlərimizi funksiya ilə yaradırıq həm də performans cəhətdən , obyektin daxililndəki funksiyaları onun prototype hissəsinə əlavə edə bilirik.

Design Patternlər haqqında danışmağa başladığımız bu seriyada , ən sadə pattern olan Factory Pattern haqqında danışdıq. Və növbə ilə, Singleton, Module və digər patternlər haqqında danışacağıq.

--

--