Tüm blog yazıları

Factory Functions Nedir?

JavaScript'te nesne oluşturmanın en basit ve etkili yolu olan Factory Functions'ı keşfedin! Bu rehberde, nesne tabanlı programlamanın temelini oluşturan bu 'fabrika fonksiyonları' ile nasıl esnek ve yeniden kullanılabilir nesneler üreteceğinizi adım adım öğrenin.

eminbasbayan6 dk okuma
JavaScript Factory Functions kavramını gösteren bir fabrika bandı görseli. Kodlama ile nesne oluşturma sürecini temsil ediyor.

Factory Functions

Giriş

Önceki makalede OOP'nin temel fikrini öğrendik: benzer nesneler üretmek için şablonlar kullanmak. Peki bu şablonları nasıl oluştururuz?

JavaScript'te nesne şablonu oluşturmanın ilk ve en basit yolu Factory Functions - yani "fabrika fonksiyonları"dır. Adından da anlaşılacağı gibi, bu fonksiyonlar bir fabrika gibi çalışır: malzeme verirsiniz, size ürün (nesne) üretir.

Factory Function Nedir?

Factory Function, çağrıldığında yeni bir nesne oluşturup döndüren fonksiyondur.

javascript
// En basit factory function
function kullaniciOlustur(ad, yas) {
    return {
        ad: ad,
        yas: yas
    };
}

// Kullanım
const kullanici1 = kullaniciOlustur("Ahmet", 25);
const kullanici2 = kullaniciOlustur("Ayşe", 30);

console.log(kullanici1);  // {ad: "Ahmet", yas: 25}
console.log(kullanici2);  // {ad: "Ayşe", yas: 30}

Fabrika Analojisi

metin
      ┌─────────────────────────────┐
      │     kullaniciOlustur()      │
      │         FABRİKA             │
      └─────────────────────────────┘
                   │
    ┌──────────────┼──────────────┐
    │              │              │
    ▼              ▼              ▼
┌────────┐   ┌────────┐    ┌────────┐
│Ahmet,25│   │Ayşe,30 │    │Ali,28  │
└────────┘   └────────┘    └────────┘

Aynı fabrika, farklı parametrelerle farklı ürünler üretir

Adım Adım Factory Function

Adım 1: Sadece Özellikler

javascript
function kitapOlustur(baslik, yazar, sayfa) {
    const kitap = {};  // Boş nesne oluştur

    kitap.baslik = baslik;
    kitap.yazar = yazar;
    kitap.sayfa = sayfa;

    return kitap;  // Nesneyi döndür
}

const kitap1 = kitapOlustur("1984", "George Orwell", 328);
console.log(kitap1);
// {baslik: "1984", yazar: "George Orwell", sayfa: 328}

Adım 2: Kısa Yazım (ES6)

ES6 ile property shorthand kullanabiliriz:

javascript
function kitapOlustur(baslik, yazar, sayfa) {
    return {
        baslik,    // baslik: baslik yerine
        yazar,     // yazar: yazar yerine
        sayfa      // sayfa: sayfa yerine
    };
}

Adım 3: Metot Ekleme

javascript
function kitapOlustur(baslik, yazar, sayfa) {
    return {
        baslik,
        yazar,
        sayfa,
        okunanSayfa: 0,

        // Metotlar
        bilgiGoster() {
            console.log(`${this.baslik} - ${this.yazar}`);
        },

        oku(sayfaSayisi) {
            this.okunanSayfa += sayfaSayisi;
            console.log(`${sayfaSayisi} sayfa okudunuz. Toplam: ${this.okunanSayfa}/${this.sayfa}`);
        },

        tamamlandiMi() {
            return this.okunanSayfa >= this.sayfa;
        }
    };
}

Kullanım

javascript
const kitap = kitapOlustur("Suç ve Ceza", "Dostoyevski", 671);

kitap.bilgiGoster();     // Suç ve Ceza - Dostoyevski
kitap.oku(50);           // 50 sayfa okudunuz. Toplam: 50/671
kitap.oku(100);          // 100 sayfa okudunuz. Toplam: 150/671
console.log(kitap.tamamlandiMi());  // false

this Keyword

Factory function içindeki metotlarda this kullanıyoruz. Peki this neyi ifade eder?

javascript
function oyuncuOlustur(isim, skor) {
    return {
        isim,
        skor,

        puanKazan(puan) {
            this.skor += puan;  // this = bu nesne
            console.log(`${this.isim} ${puan} puan kazandı!`);
        },

        durumGoster() {
            console.log(this);  // Tüm nesneyi gösterir
        }
    };
}

const oyuncu1 = oyuncuOlustur("Zeynep", 0);
oyuncu1.puanKazan(10);  // Zeynep 10 puan kazandı!
oyuncu1.durumGoster();  // {isim: "Zeynep", skor: 10, puanKazan: ƒ, durumGoster: ƒ}

this Nasıl Çalışır?

javascript
oyuncu1.puanKazan(10);
//  ↑
//  │
// this, noktanın solundaki nesneyi ifade eder
// Yani: this = oyuncu1

Pratik Örnek: Hesap Makinesi

javascript
function hesapMakinesiOlustur() {
    return {
        sonuc: 0,
        gecmis: [],

        topla(sayi) {
            this.sonuc += sayi;
            this.gecmis.push(`+${sayi}`);
            return this;  // Zincirleme için
        },

        cikar(sayi) {
            this.sonuc -= sayi;
            this.gecmis.push(`-${sayi}`);
            return this;
        },

        carp(sayi) {
            this.sonuc *= sayi;
            this.gecmis.push(`×${sayi}`);
            return this;
        },

        bol(sayi) {
            if (sayi === 0) {
                console.log("Sıfıra bölünemez!");
                return this;
            }
            this.sonuc /= sayi;
            this.gecmis.push(`÷${sayi}`);
            return this;
        },

        sifirla() {
            this.sonuc = 0;
            this.gecmis = [];
            return this;
        },

        sonucuAl() {
            return this.sonuc;
        },

        gecmisiGoster() {
            console.log("İşlemler:", this.gecmis.join(" "));
            console.log("Sonuç:", this.sonuc);
        }
    };
}

// Kullanım
const hesap = hesapMakinesiOlustur();

hesap.topla(10);
hesap.carp(5);
hesap.cikar(20);
hesap.bol(2);
hesap.gecmisiGoster();
// İşlemler: +10 ×5 -20 ÷2
// Sonuç: 15

// Zincirleme kullanım (method chaining)
hesap.sifirla().topla(100).cikar(30).carp(2).gecmisiGoster();
// İşlemler: +100 -30 ×2
// Sonuç: 140

Pratik Örnek: Ürün Yönetimi

javascript
function urunOlustur(ad, fiyat, stok) {
    return {
        ad,
        fiyat,
        stok,
        satisAdedi: 0,

        bilgiGoster() {
            console.log(`
                Ürün: ${this.ad}
                Fiyat: ${this.fiyat} TL
                Stok: ${this.stok} adet
                Satış: ${this.satisAdedi} adet
            `);
        },

        spipleşmek(adet) {
            if (adet > this.stok) {
                console.log(`Yetersiz stok! Mevcut: ${this.stok}`);
                return false;
            }
            this.stok -= adet;
            this.satisAdedi += adet;
            console.log(`${adet} adet ${this.ad} satıldı.`);
            return true;
        },

        stokEkle(adet) {
            this.stok += adet;
            console.log(`${adet} adet eklendi. Yeni stok: ${this.stok}`);
        },

        indirimUygula(yuzde) {
            const indirim = this.fiyat * (yuzde / 100);
            this.fiyat -= indirim;
            console.log(`%${yuzde} indirim! Yeni fiyat: ${this.fiyat} TL`);
        },

        toplamSatisGetirisi() {
            return this.satisAdedi * this.fiyat;
        }
    };
}

// Kullanım
const telefon = urunOlustur("iPhone 15", 45000, 50);
const kulaklik = urunOlustur("AirPods Pro", 8000, 100);

telefon.spipleşmek(5);        // 5 adet iPhone 15 satıldı.
telefon.indirimUygula(10);   // %10 indirim! Yeni fiyat: 40500 TL
telefon.bilgiGoster();

kulaklik.spipleşmek(200);     // Yetersiz stok! Mevcut: 100
kulaklik.stokEkle(50);       // 50 adet eklendi. Yeni stok: 150

Factory Function'ın Avantajları

1. Basitlik

javascript
// Anlaşılması ve yazması kolay
function noktaOlustur(x, y) {
    return { x, y };
}

2. new Keyword Gerektirmez

javascript
// Factory function
const nokta1 = noktaOlustur(10, 20);  // ✓ Doğrudan çağır

// Constructor function (ileride göreceğiz)
const nokta2 = new Nokta(10, 20);     // new gerekli

3. Özel (Private) Değişkenler

Closure kullanarak gizli değişkenler oluşturabilirsiniz:

javascript
function sayacOlustur() {
    let sayac = 0;  // Dışarıdan erişilemez!

    return {
        artir() {
            sayac++;
            console.log(sayac);
        },
        azalt() {
            sayac--;
            console.log(sayac);
        },
        degerAl() {
            return sayac;
        }
    };
}

const sayac = sayacOlustur();
sayac.artir();   // 1
sayac.artir();   // 2
sayac.artir();   // 3
sayac.azalt();   // 2

console.log(sayac.sayac);  // undefined - Erişilemez!
console.log(sayac.degerAl());  // 2 - Sadece metotla erişilebilir

Factory Function'ın Dezavantajı: Hafıza Sorunu

İşte kritik nokta! Her factory function çağrısında metotların yeni kopyaları oluşturulur:

javascript
function kullaniciOlustur(ad) {
    return {
        ad,
        selamla() {
            console.log(`Merhaba, ben ${this.ad}`);
        }
    };
}

const user1 = kullaniciOlustur("Ali");
const user2 = kullaniciOlustur("Veli");

// Her nesnenin kendi selamla kopyası var!
console.log(user1.selamla === user2.selamla);  // false

Görsel Temsil

metin
Factory Function ile:

┌─────────────────┐     ┌─────────────────┐
│     user1       │     │     user2       │
├─────────────────┤     ├─────────────────┤
│ ad: "Ali"       │     │ ad: "Veli"      │
│ selamla: ƒ ────────   │ selamla: ƒ ────────  Her birinin
└─────────────────┘  │  └─────────────────┘ │  AYRI kopyası!
                     │                       │
                     ▼                       ▼
              function() {...}        function() {...}
              (Kopya 1)               (Kopya 2)

Prototype ile (İdeal):

metin
┌─────────────────┐     ┌─────────────────┐
│     user1       │     │     user2       │
├─────────────────┤     ├─────────────────┤
│ ad: "Ali"       │     │ ad: "Veli"      │
│ __proto__: ─────┼─────┼─────────────────┼────┐
└─────────────────┘     └─────────────────┘    │
                                               │
                                               ▼
                                    ┌───────────────────┐
                                    │    Prototype      │
                                    │  selamla: ƒ       │
                                    └───────────────────┘
                                    (Tek kopya, paylaşılır)

Hafıza Karşılaştırması

javascript
// 1000 kullanıcı oluşturduğumuzu düşünelim

// Factory Function ile:
// 1000 x selamla() fonksiyonu = 1000 kopya 😱

// Prototype ile:
// 1 x selamla() fonksiyonu = 1 kopya ✓
// (Tüm kullanıcılar aynı prototype'ı paylaşır)

Ne Zaman Factory Function Kullanmalı?

Kullanın ✓

  • Basit, az metotlu nesneler için
  • Private değişkenler gerektiğinde
  • new keyword'ünden kaçınmak istediğinizde
  • Hızlı prototipleme yaparken

Kullanmayın ✗

  • Çok sayıda nesne üretecekseniz
  • Metotları paylaşmak istiyorsanız
  • Performans kritikse
  • Inheritance (miras) kullanacaksanız

Özet

javascript
// Factory Function şablonu
function nesneOlustur(param1, param2) {
    return {
        // Özellikler
        ozellik1: param1,
        ozellik2: param2,

        // Metotlar
        metot1() {
            // this.ozellik1 kullanarak işlem yap
        },

        metot2() {
            // this.ozellik2 kullanarak işlem yap
        }
    };
}

// Kullanım
const nesne = nesneOlustur(deger1, deger2);
nesne.metot1();
ÖzellikAçıklama
TanımNesne üreten ve döndüren fonksiyon
AvantajBasit, new gerektirmez, private değişkenler
DezavantajHer nesne metotların kopyasını taşır (hafıza israfı)
thisMetot içinde nesnenin kendisini ifade eder

Sırada Ne Var?

Factory function'ların hafıza sorununu gördük. Her nesne metotların kopyasını taşıyor - bu ideal değil.

Bir sonraki makalede Constructor Functions ve new keyword'ünü öğreneceğiz. Bu yöntem prototype'ı kullanarak metotları paylaştırır ve hafıza sorununu çözer.

JavaScript Classes ile pratik uygulamalar, metotlar arası iletişim ve gerçek dünya kod örnekleri
JavaScript Dersleri9 dk okuma

JavaScript Classes - Pratik Uygulamalar

JavaScript class'ları ile pratik uygulamalara geçin! Metotlar arası iletişimden constructor'da metot çağırmaya, kod tekrarını azaltmaktan gerçek dünya senaryolarına kadar class kullanımının inceliklerini keşfedin. Kendi alışveriş sepeti örneğinizle bilginizi pekiştirin.

Yazıyı oku
JavaScript class yapısını gösteren bir kod örneği, ES6 ile modern nesne oluşturma
JavaScript Dersleri9 dk okuma

JavaScript Classes

ES6 ile JavaScript'e gelen class yapısı sayesinde nesne oluşturmak artık çok daha kolay ve düzenli! Constructor function karmaşasından kurtulup, okunabilir ve yönetilebilir kodlar yazmak isteyenler için modern JavaScript'in temel taşı olan class'ları tüm detaylarıyla keşfedin. Bu rehberle nesne şabl

Yazıyı oku
JavaScript kodunda Constructor Function ve new keyword'ü ile nesne oluşturma örnekleri
JavaScript Dersleri8 dk okuma

Constructor Functions ve new Keyword

Factory Function'ların hafıza israfı sorununa Constructor Function'lar ve new keyword'ü ile son verin! Metotları paylaştırarak JavaScript objelerini daha verimli nasıl oluşturacağınızı, new'in perde arkasında neler yaptığını ve prototype sisteminin gücünü bu rehberde keşfedin.

Yazıyı oku

Çerez tercihlerin

Platformun çalışması için zorunlu çerezler kullanıyoruz. İzin verirsen anonim kullanım verilerini ölçüyoruz. Ayrıntıları incele