Skip to main content
Yazılım Geliştirme

Yazılım Tasarım Kalıpları: Singleton, Factory, Observer, Strategy ve Repository Rehberi

Mart 29, 2026 5 dk okuma 4 views Raw
Ayrıca mevcut: en
Yazılım tasarım kalıpları ve kod geliştirme
İçindekiler

Yazılım Tasarım Kalıpları Nedir?

Yazılım tasarım kalıpları (design patterns), yazılım geliştirme sürecinde tekrar eden problemlere karşı kanıtlanmış, yeniden kullanılabilir çözümler sunan şablonlardır. İlk olarak 1994 yılında "Gang of Four" (GoF) olarak bilinen Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides tarafından "Design Patterns: Elements of Reusable Object-Oriented Software" kitabında sistematik olarak belgelenmiştir.

Tasarım kalıpları, doğrudan kopyalanıp yapıştırılacak kod parçacıkları değildir. Bunlar, belirli bir bağlamda karşılaşılan tasarım sorunlarını çözmek için kullanılan kavramsal şablonlardır. Her kalıp, bir problemi, çözümü ve sonuçlarını tanımlar. Bu rehberde en yaygın kullanılan beş tasarım kalıbını derinlemesine inceleyeceğiz.

Tasarım Kalıplarının Sınıflandırılması

Tasarım kalıpları üç ana kategoriye ayrılır:

  • Yaratımsal Kalıplar (Creational): Nesne oluşturma mekanizmalarıyla ilgilenir. Singleton, Factory Method, Abstract Factory, Builder ve Prototype bu kategoriye girer.
  • Yapısal Kalıplar (Structural): Sınıfların ve nesnelerin birleştirilme biçimiyle ilgilenir. Adapter, Bridge, Composite, Decorator, Facade, Flyweight ve Proxy bu gruba dahildir.
  • Davranışsal Kalıplar (Behavioral): Nesneler arasındaki iletişim ve sorumluluk dağılımıyla ilgilenir. Observer, Strategy, Command, Iterator, Mediator, State ve Template Method bu kategoridedir.

1. Singleton Tasarım Kalıbı

Singleton Nedir?

Singleton, bir sınıftan yalnızca tek bir örnek (instance) oluşturulmasını garanti eden ve bu örneğe global bir erişim noktası sağlayan yaratımsal bir tasarım kalıbıdır. Veritabanı bağlantı havuzları, yapılandırma yöneticileri, loglama servisleri ve önbellek mekanizmaları gibi senaryolarda sıklıkla kullanılır.

Singleton Nasıl Çalışır?

Singleton kalıbı şu temel prensiplere dayanır:

  1. Sınıfın constructor metodu private olarak tanımlanır, böylece dışarıdan new anahtar kelimesiyle nesne oluşturulamaz.
  2. Sınıf içinde statik bir alan (field) ile tek örnek saklanır.
  3. Statik bir metot veya özellik (property) aracılığıyla bu tek örneğe erişim sağlanır.
  4. Thread-safety için gerekli önlemler alınır (özellikle çok iş parçacıklı ortamlarda).

Singleton Kullanım Alanları

  • Veritabanı bağlantı havuzu yönetimi
  • Uygulama yapılandırma ayarları
  • Loglama altyapısı
  • Önbellek (cache) yönetimi
  • Thread pool yönetimi

Singleton kalıbı güçlü bir araçtır, ancak aşırı kullanımı kodun test edilebilirliğini azaltabilir. Dependency Injection ile birlikte kullanıldığında bu sorun minimize edilir.

2. Factory Tasarım Kalıbı

Factory Method Nedir?

Factory Method, nesne oluşturma işlemini alt sınıflara devreden yaratımsal bir tasarım kalıbıdır. İstemci kodunun somut sınıflardan bağımsız olmasını sağlar. Bir üst sınıf, nesne oluşturmak için bir arayüz tanımlar ve alt sınıflar hangi sınıfın örneğinin oluşturulacağına karar verir.

Factory Method vs Abstract Factory

Bu iki kalıp sıklıkla karıştırılır. Temel farkları şunlardır:

ÖzellikFactory MethodAbstract Factory
KapsamTek bir ürün ailesiİlişkili ürün aileleri
UygulamaKalıtım ileKompozisyon ile
EsneklikTek ürün türüBirden fazla ürün türü
KarmaşıklıkDaha basitDaha karmaşık

Factory Kalıbının Avantajları

  • Gevşek bağlılık (loose coupling) sağlar
  • Açık/Kapalı prensibine (Open/Closed Principle) uygun
  • Tek Sorumluluk İlkesini (Single Responsibility) destekler
  • Kodun test edilebilirliğini artırır
  • Yeni türler eklemek mevcut kodu bozmaz

3. Observer Tasarım Kalıbı

Observer Nedir?

Observer (Gözlemci), bir nesnenin durumu değiştiğinde bağımlı nesnelerin otomatik olarak bilgilendirilmesini ve güncellenmesini sağlayan davranışsal bir tasarım kalıbıdır. "Yayınla-Abone ol" (Publish-Subscribe) modeli olarak da bilinir.

Observer Kalıbının Bileşenleri

Observer kalıbı dört temel bileşenden oluşur:

  1. Subject (Konu): Durumu izlenen nesnedir. Gözlemcilerin listesini tutar ve onlara bildirim gönderir.
  2. Observer (Gözlemci): Subject'teki değişikliklerden haberdar olmak isteyen nesneler için tanımlanan arayüzdür.
  3. ConcreteSubject: Subject arayüzünü uygulayan somut sınıftır. Durum değiştiğinde gözlemcilere haber verir.
  4. ConcreteObserver: Observer arayüzünü uygulayan somut sınıftır. Subject'in durum değişikliklerine tepki verir.

Observer Kullanım Senaryoları

  • Olay yönetim sistemleri (event handling)
  • Kullanıcı arayüzü güncellemeleri (MVC, MVVM)
  • Gerçek zamanlı bildirim sistemleri
  • Stok fiyat izleme uygulamaları
  • Sosyal medya bildirim mekanizmaları

4. Strategy Tasarım Kalıbı

Strategy Nedir?

Strategy (Strateji), bir algoritma ailesini tanımlayan, her birini kapsülleyen ve birbirlerinin yerine kullanılabilir hale getiren davranışsal bir tasarım kalıbıdır. İstemcinin kullandığı algoritmayı çalışma zamanında değiştirmesine olanak tanır.

Strategy Kalıbı Ne Zaman Kullanılır?

Strategy kalıbı şu durumlarda idealdir:

  • Bir işlemin birden fazla yolu varsa ve çalışma zamanında seçim yapılması gerekiyorsa
  • Benzer sınıflar yalnızca davranış biçimleriyle farklılaşıyorsa
  • Algoritmanın istemci kodundan izole edilmesi gerekiyorsa
  • Koşullu ifadelerin (if-else, switch-case) sayısını azaltmak istiyorsanız
  • Açık/Kapalı prensibine uygun genişletilebilir bir yapı kurulacaksa

Strategy ile İlgili Gerçek Dünya Örnekleri

SenaryoStratejiAçıklama
Ödeme işlemeKredi kartı, PayPal, HavaleHer ödeme yöntemi farklı strateji
SıralamaQuickSort, MergeSort, BubbleSortVeri boyutuna göre algoritma seçimi
SıkıştırmaZIP, GZIP, RARDosya türüne göre sıkıştırma yöntemi
DoğrulamaE-posta, Telefon, TC KimlikAlan türüne göre doğrulama kuralı

5. Repository Tasarım Kalıbı

Repository Nedir?

Repository kalıbı, veri erişim mantığını iş mantığından ayıran yapısal bir tasarım kalıbıdır. Veri kaynağına (veritabanı, API, dosya sistemi) erişimi soyutlayarak uygulama katmanının veri kaynağından bağımsız çalışmasını sağlar. Domain-Driven Design (DDD) yaklaşımının temel taşlarından biridir.

Repository Kalıbının Faydaları

  1. Soyutlama: Veri erişim detaylarını gizler, iş mantığı temiz kalır.
  2. Test Edilebilirlik: Mock repository'ler ile birim testler kolaylaşır.
  3. Tek Sorumluluk: Her repository yalnızca bir varlık (entity) ile ilgilenir.
  4. Değiştirilebilirlik: Veri kaynağı değişikliği iş mantığını etkilemez.
  5. Yeniden Kullanılabilirlik: Ortak sorgular merkezi bir yerde tanımlanır.

Generic Repository vs Specific Repository

Generic Repository, tüm varlıklar için ortak CRUD işlemlerini tanımlar. Specific Repository ise belirli bir varlığa özel sorguları içerir. Modern yaklaşımda ikisinin birlikte kullanılması önerilir:

  • Generic Repository: Add, Update, Delete, GetById, GetAll gibi temel işlemler
  • Specific Repository: GetActiveUsers, FindByEmail gibi varlığa özel sorgular

Repository kalıbı, özellikle Entity Framework veya NHibernate gibi ORM araçlarıyla birlikte kullanıldığında, Unit of Work kalıbıyla kombinlenerek çok güçlü bir veri erişim katmanı oluşturur.

Tasarım Kalıplarını Birlikte Kullanmak

Gerçek dünya projelerinde tasarım kalıpları nadiren tek başına kullanılır. İşte yaygın kombinasyonlar:

  • Repository + Unit of Work: Veri erişim katmanı için altın standart
  • Factory + Strategy: Çalışma zamanında algoritma seçimi ve nesne oluşturma
  • Observer + Singleton: Uygulama genelinde olay yönetimi
  • Strategy + Factory + Observer: Esnek ve genişletilebilir mimari

Tasarım Kalıplarında Sık Yapılan Hatalar

Tasarım kalıplarını kullanırken dikkat edilmesi gereken noktalar:

  1. Aşırı mühendislik: Her soruna bir kalıp uygulamaya çalışmak kodu gereksiz karmaşık hale getirir.
  2. Yanlış kalıp seçimi: Problemi tam anlamadan kalıp seçmek, çözümden çok sorun yaratır.
  3. Erken optimizasyon: İhtiyaç ortaya çıkmadan kalıp uygulamak YAGNI prensibini ihlal eder.
  4. Kalıpları dogma olarak görmek: Kalıplar rehberdir, katı kural değildir. Projenize göre uyarlayın.

Sonuç

Tasarım kalıpları, yazılım geliştirme dünyasının ortak dilini oluşturur. Singleton ile kaynak yönetimini optimize eder, Factory ile nesne oluşturmayı soyutlar, Observer ile gevşek bağlı olay sistemleri kurar, Strategy ile esnek algoritma yapıları tasarlar ve Repository ile temiz bir veri erişim katmanı inşa ederiz. Bu kalıpları anlamak ve doğru yerde kullanmak, sürdürülebilir, test edilebilir ve ölçeklenebilir yazılımlar geliştirmenin temelini oluşturur.

Bu yazıyı paylaş