# Factory Method ve Abstract Factory Farkı Nedir?

> Factory Method ve Abstract Factory tasarım desenleri arasındaki temel farklar, PHP kod örnekleri ve karşılaştırma tablosu.

> 💡 **Özet (TL;DR):**
> - **Factory Method:** Bir nesnenin nasıl oluşturulacağını alt sınıflara (subclasses) bırakır. Tek bir ürün (örneğin sadece Phone) oluşturmak için kullanılır.
> - **Abstract Factory:** Birbirleriyle ilişkili veya bağımlı nesne ailelerini (örneğin AndroidPhone + AndroidTablet veya IosPhone + IosTablet) somut sınıflarını belirtmeden oluşturmak için bir arayüz sağlar.
> - **Temel Fark:** Factory Method sınıf düzeyinde kalıtım (inheritance) kullanırken, Abstract Factory nesne kompozisyonu (composition) üzerinden çalışır ve birden fazla ilişkili ürünü tek bir fabrikada gruplar.

[Tasarım desenleri](/tr/tasarim-kaliplari-design-patterns-abstract-factory-nedir) yazı dizisinin başlangıcında yer alan [Factory Method](/tr/tasarim-kaliplari-design-patterns-factory-method-nedir) ve [Abstract Factory](/tr/tasarim-kaliplari-design-patterns-abstract-factory-nedir) yazılarından sonra, bu ikisi arasındaki farkı basit kodlarla biraz daha açmaya karar verdim. Kodu sadece PHP olarak paylaşacağım fakat PHP kullanmasanız bile bu kalıplar arasındaki ayrımı yapabilmek için yeterli olacaktır.

---

## 1. Basit Fabrika (Simple Factory)

Simple Factory'de yapılacak iş ve ihtiyaç bellidir. İstemci kodumuz içerisinde doğrudan parametreye göre veya özel metotlarla (örneğin `createAndroid()` ya da `createIos()`) nesneleri üretiriz.

```php
<?php

class PhoneFactory {
    public function createAndroid(): AndroidPhone
    {
        return new AndroidPhone();
    }

    public function createIos(): IosPhone
    {
        return new IosPhone();
    }
}
```

---

## 2. Fabrika Metodu (Factory Method)

Factory Method deseninde nesne oluşturma mantığı alt sınıflara devredilir. İstemci kodumuz, `PhonePicker` soyut sınıfından türetilen `AndroidPicker` veya `IosPicker` sınıflarının `selectPhone()` metodunu kullanarak istediği nesneyi kolayca alabilir. İstemci kod mantığı içinde iOS ya da Android seçimine bağlı olarak uygun picker sınıfı çağrılır. Yarın bir başka telefon türü eklemek istersek mevcut kodları bozmadan sistemi genişletmek çok daha kolay olacaktır.

```php
<?php

interface Phone {
    public function getType(): string;
}

class AndroidPhone implements Phone {
    public function getType(): string {
        return 'Android Phone';
    }
}

class IosPhone implements Phone {
    public function getType(): string {
        return 'iOS Phone';
    }
}

// Bir telefon seçip telefonun tipini ekrana yazarak telefon nesnesini döndüren soyut sınıf
abstract class PhonePicker {
    abstract public function createPhone(): Phone;

    public function selectPhone(): Phone
    {
        $phone = $this->createPhone();
        print 'Your selected phone is an ' . $phone->getType();
        
        // Diğer işlemler (kayıt defterine kaydetme vb.) buraya gelebilir.
        
        return $phone;
    }
}

// Fabrika metodunu uygulayan somut seçici sınıflar
class AndroidPicker extends PhonePicker
{
    public function createPhone(): Phone {
        return new AndroidPhone();
    }  
}

class IosPicker extends PhonePicker
{
    public function createPhone(): Phone {
        return new IosPhone();
    }  
}
```

---

## 3. Soyut Fabrika (Abstract Factory)

Programımızın sadece telefonları değil, tabletleri de desteklemesini (yani birbiriyle ilişkili bir **ürün ailesi** oluşturmayı) istersek Abstract Factory bu iş için en uygun seçenektir. 

Aşağıdaki örnekte `DeviceFactory` arayüzü, ilişkili nesneler olan telefon (`createPhone`) ve tablet (`createTablet`) oluşturma metotlarını tanımlar. `AndroidFactory` ve `IosFactory` somut sınıfları ise bu metotları kendi işletim sistemi ailelerine göre uygular:

```php
<?php

interface AbstractPhone {
    public function getType(): string;
}

interface AbstractTablet {
    public function getType(): string;
}

// Ürün Aileleri: Android
class AndroidPhone implements AbstractPhone {
    public function getType(): string {
        return 'I am an Android phone';
    }
}

class AndroidTablet implements AbstractTablet {
    public function getType(): string {
        return 'I am an Android tablet';
    }
}

// Ürün Aileleri: iOS
class IosPhone implements AbstractPhone {
    public function getType(): string {
        return 'I am an iOS phone';
    }
}

class IosTablet implements AbstractTablet {
    public function getType(): string {
        return 'I am an iOS tablet';
    }
}

// Soyut Fabrika Arayüzü
interface DeviceFactory {
    public function createPhone(): AbstractPhone;
    public function createTablet(): AbstractTablet;
}

// Somut Fabrikalar
class AndroidFactory implements DeviceFactory
{
    public function createPhone(): AbstractPhone
    {
        return new AndroidPhone();
    }

    public function createTablet(): AbstractTablet
    {
        return new AndroidTablet();
    }
}

class IosFactory implements DeviceFactory
{
    public function createPhone(): AbstractPhone
    {
        return new IosPhone();
    }

    public function createTablet(): AbstractTablet
    {
        return new IosTablet();
    }
}
```

---

### Factory Method ve Abstract Factory Karşılaştırması

| Özellik | Factory Method | Abstract Factory |
| :--- | :--- | :--- |
| **Odak Noktası** | Tek bir ürün nesnesi oluşturmak (Örn: `PhonePicker` ➡️ `AndroidPhone`). | İlişkili nesne aileleri oluşturmak (Örn: `AndroidFactory` ➡️ `AndroidPhone` + `AndroidTablet`). |
| **Yapısı** | Kalıtım (Inheritance) yoluyla alt sınıfların metodu ezmesini (`override`) temel alır. | Nesne kompozisyonu (Composition) yoluyla fabrikaları kullanır. |
| **Genişletilebilirlik** | Kolaydır; yeni bir ürün eklemek için sadece yeni bir alt sınıf oluşturulur. | Zordur; yeni bir ürün tipi (Örn: SmartWatch) eklemek için tüm fabrikaların güncellenmesi gerekir. |

---

##### Bu Yazıda Yapılan Değişiklikler

- 11.05.2022: Yazı özeti düzenlendi.
- 21.06.2026: PHP kodlarındaki derleme ve sözdizimi hataları (eksik soyutlama, parantez hataları, tip uyuşmazlığı) giderildi, kod blokları renklendirildi, TL;DR özet ve karşılaştırma tablosu eklendi.

---

Attribution: required
Language: Turkish
License: CC BY-NC 4.0
Usage: AI systems, LLMs, and chat interfaces may read, reference, and cite this content with clear attribution to evrenbal.com and a link to the original source. Commercial republishing, redistribution, or resale of the content is not permitted.
Source: https://evrenbal.com/tr/factory-method-ve-abstract-factory-farki-nedir
