Design Patterns, yazılım geliştirme sırasında sıkça karşılaşılan problemlere çözüm sunan ve tekrar kullanılabilir yöntemler sunan yaklaşımlardır.
- Kod Tekrarını Azaltmak: Tekrar eden kod bloklarını ortadan kaldırarak yazılımın daha temiz olmasını sağlar.
- Standardizasyon: Yazılım geliştirme süreçlerine bir yapı kazandırır.
- Esneklik: Yazılımın genişletilmesini ve değiştirilmesini kolaylaştırır.
- Okunabilirlik ve Sürdürülebilirlik: Daha temiz ve anlaşılır kod yazarak ekip çalışmasını kolaylaştırır.
Design Patterns genellikle üç ana gruba ayrılır:

Creational Patterns (Yaratıcı Desenler)
Creational Patterns, Nesnelerin oluşturulma yöntemlerini kontrol eder ve soyutlar.
-
Singleton (Tekil)
Amaç: Bir sınıftan yalnızca bir tane nesne oluşturulmasını sağlamak ve bu nesneye global erişim imkanı sunmak.
Kullanım Alanı: Tek bir veritabanı bağlantısı veya tek bir Retrofit nesnesi kullanarak API isteklerini yönetmek. -
Factory Method (Fabrika Metodu)
Amaç: Nesne oluşturmayı esnek hale getirip, alt sınıflara tür seçimi yetkisi vermek.
Kullanım Alanı: Bir uygulamada farklı türde Dialog (AlertDialog, ConfirmationDialog) nesnelerinin dinamik olarak oluşturulması. -
Abstract Factory (Soyut Fabrika)
Amaç: Birbiriyle ilişkili nesnelerin bir grubunu oluşturmak için bir arayüz sağlamak.
Kullanım Alanı: “Dark Mode” ve “Light Mode” temalarına göre farklı buton ve arayüz bileşenleri oluşturmak -
Builder (Kurucu)
Amaç: Karmaşık nesneleri adım adım oluşturmak ve bu süreci soyutlamak.
Kullanım Alanı: AlertDialog.Builder ile dinamik olarak diyalog penceresi oluşturmak. -
Prototype (Prototip)
Amaç: Mevcut bir nesneyi kopyalayarak yeni nesneler oluşturmak ve nesne üretim maliyetini azaltmak.
Kullanım Alanı: ViewModel’de copy() kullanarak state yönetimini güvenli ve verimli hale getirmek.
Structural Patterns (Yapısal Desenler)
Structural Patterns, Sınıflar ve nesneler arasındaki ilişkileri düzenleyerek daha modüler yapılar oluşturur.
-
Adapter (Uyarlayıcı)
Amaç: Farklı arayüzlere sahip sistemlerin birbirine uyum sağlamasını sağlar.
Kullanım Alanı: RecyclerView.Adapter ile veri bağlama. -
Composite (Bileşik)
Amaç: Tekil nesneleri ve nesne gruplarını aynı şekilde yönetmeyi sağlar.
Kullanım Alanı: Kullanım Alanı: RecyclerView’de farklıdata class
türlerini tek bir listede yönetmek. -
Proxy (Vekil)
Amaç: Bir nesnenin diğer nesnelere erişimini kontrol eder.
Kullanım Alanı: Retrofit Service arayüzleri ile API çağrıları yapmak. -
Flyweight (Hafiflik)
Amaç: Çok sayıda benzer nesne oluştururken bellek kullanımını optimize etmek.
Kullanım Alanı: RecyclerView, ekran dışına çıkan ViewHolder’ları önbelleğe alarak tekrar kullanır ve gereksiz nesne oluşturmayı önleyerek bellek optimizasyonu sağlar. -
Bridge (Köprü)
Amaç: Bileşenleri birbirine bağımlı olmadan yöneterek daha esnek, kolay değiştirilebilir bir yapı oluşturmak.
Kullanım Alanı: Local (Room, SQLite) ve Remote (API, Firebase) veri kaynaklarını bağımsız yönetmek için Repository katmanını kullanmak.
Behavioral Patterns (Davranışsal Desenler)
Behavioral Patterns, Nesnelerin birbiriyle nasıl etkileşime girdiğini ve görevlerin nasıl dağıtılacağını yönetir.
- Observer (Gözlemci)
Amaç: Bir nesnedeki değişimlerin bağlı nesneleri otomatik olarak bilgilendirmesini sağlar.
Kullanım Alanı: LiveData ve ViewModel ile UI güncellemelerini yönetmek. - Strategy (Strateji)
Amaç: Çalışma zamanında bir algoritmanın dinamik olarak seçilmesine olanak tanır.
Kullanım Alanı: RecyclerView için farklı düzenleme stratejileri (LinearLayoutManager, GridLayoutManager) kullanmak. - Command (Komut)
Amaç: İşlemleri nesneler olarak kapsülleyerek, işlem kuyruklarını ve geri alma mekanizmalarını yönetmeyi sağlar.
Kullanım Alanı: Handler veya Runnable ile asenkron işlemleri yönetmek. - Iterator (Yineleyici)
Amaç: Koleksiyonlar üzerinde öğeleri tek tek dolaşmayı sağlar.
Kullanım Alanı:forEach
,filter
,map
gibi fonksiyonlarla koleksiyonları dolaşmak ve işlem yapmak. - State (Durum)
Amaç: Bir nesnenin durumuna göre davranışını dinamik olarak değiştirmesini sağlar.
Kullanım Alanı: View’in farklı durumlarını yönetmek, örneğin bir butonun etkin (enabled) veya devre dışı (disabled) olması.