Skip to content

Latest commit

 

History

History
190 lines (160 loc) · 4.26 KB

File metadata and controls

190 lines (160 loc) · 4.26 KB

Factory Method (Fabrika Metodu)

Factory Method, creational (oluşturucu) design pattern kategorisine girer.

🧠 Amaç

Nesne oluşturma (object creation) sorumluluğunu alt sınıflara devretmektir.

Üst sınıf, hangi somut sınıfın üretildiğini bilmez.


🧩 Yapı

  • Product (Ürün): Ortak arayüz → ITasiyici
  • Concrete Product: Kamyon, Gemi
  • Creator (Fabrika): Lojistik
  • Concrete Creator: KaraLojistik, DenizLojistik

UML Diyagramı

image ---

💻 Örnek Kod (C#)

// Tüm taşıma araçlarının ortak arayüzü
public interface ITasiyici
{
    void TeslimEt();
}

// Concrete Product
public class Kamyon : ITasiyici
{
    public void TeslimEt()
    {
        Console.WriteLine("Karayolu ile paket teslim edildi.");
    }
}

// Concrete Product
public class Gemi : ITasiyici
{
    public void TeslimEt()
    {
        Console.WriteLine("Deniz yolu ile paket teslim edildi.");
    }
}

// Creator (Fabrika)
public abstract class Lojistik
{
    public abstract ITasiyici TasimaOlustur();

    public void OperasyonuBaslat()
    {
        ITasiyici tasiyici = TasimaOlustur();
        tasiyici.TeslimEt();
    }
}

// Concrete Creator
public class KaraLojistik : Lojistik
{
    public override ITasiyici TasimaOlustur() => new Kamyon();
}

// Concrete Creator
public class DenizLojistik : Lojistik
{
    public override ITasiyici TasimaOlustur() => new Gemi();
}

// Client
class Program
{
    static void Main()
    {
        Lojistik lojistik = new KaraLojistik();
        lojistik.OperasyonuBaslat(); 
        // Output: Karayolu ile paket teslim edildi.
    }
}

Çıktı

image

Örnek-2

image

💻 Örnek Kod (C#)

//1. Adım Sözleşme
public interface IEnemies
{
    string Name { get; }
    int Health { get; }
    void Attack();
}
public class Goblin : IEnemies
{
    public string Name { get; private set; }
    public int Health { get; private set; }
    public Goblin()
    {
        Name = "Goblin";
        Health = 50;
    }
    public void Attack()
    {
        Console.WriteLine($"{Name} , Can: {Health}");
    }
   
}
public class Dragon : IEnemies
{
    public string Name { get; private set; }
    public int Health { get; private set; }
    public Dragon()
    {
        Name = "Dragon";
        Health = 150;
    }
    public void Attack()
    {
        Console.WriteLine($"{Name} ateş püskürttü , kalan can : {Health}");
    }
}
public class Orc : IEnemies
{
    public string Name { get; private set; }
    public int Health { get; private set; }
    public Orc()
    {
        Name = "Orc";
        Health = 400;
    }
    public void Attack()
    {
        Console.WriteLine($"{Name} , Can : {Health}");
    }
}
// Ana soyut fabrika şeması
public abstract class EnemyFactory
{
    // Bu metot çağrıldığında geriye kurallara uyan (IEnemies) bir düşman dönecek
    public abstract IEnemies CreateEnemy();
}

// Goblin Üreten Fabrika
public class GoblinFactory : EnemyFactory
{
    public override IEnemies CreateEnemy() => new Goblin();
}

// Orc Üreten Fabrika
public class OrcFactory : EnemyFactory
{
    public override IEnemies CreateEnemy() => new Orc();
}

// Dragon Üreten Fabrika
public class DragonFactory : EnemyFactory
{
    public override IEnemies CreateEnemy() => new Dragon();
}

class Program
{
    public static void Main()
    {
        EnemyFactory fabrika = new DragonFactory(); // Boss odasına geldik!

        // Fabrikayı çalıştırıyoruz. Arka planda 'new Dragon()' dönüyor 
        // ama Main metodu bunu görmüyor, sadece 'IEnemies' tipinde bir düşman alıyor.
        IEnemies canavar = fabrika.CreateEnemy();

        // Düşman kimse ona göre saldırıyor
        canavar.Attack(); // Çıktı: Dragon ateş püskürttü!


    }
}

Çıktı

image