Factory Method ve Abstract Factory Farkı Nedir?

Sayfayı kopyala
💡 Ö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 yazı dizisinin başlangıcında yer alan Factory Method ve Abstract Factory 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
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
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
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.
