Tasarım Kalıplarına Giriş
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 64 / 87.
Tasarım desenleri, yazılım geliştirirken geliştiricilerin tekrar tekrar karşılaştığı yaygın sorunlara yönelik kanıtlanmış çözümlerdir. Her seferinde tekerleği yeniden icat etmek yerine, yinelenen tasarım zorluklarını çözmek için bu zamanla test edilmiş şablonları uygulayabilirsiniz.
Tasarım desenlerini birer taslak gibi düşünün. Size kopyalayıp yapıştırabileceğiniz hazır kodlar sunmazlar, ancak belirli bir problem türünü çözmek için sınıflarınızı ve nesnelerinizi nasıl yapılandıracağınızı tarif ederler. Öğreneceğiniz desenler; kalıtım, arayüzler, çok biçimlilik ve kompozisyon gibi halihazırda uzmanlaştığınız OOP kavramlarından yararlanır.
Tasarım desenleri üç ana kategoriye ayrılır:
| Kategori | Amaç | Örnekler |
|---|---|---|
| Yaratımsal | Nesnelerin nasıl oluşturulduğu | Singleton, Factory, Builder |
| Yapısal | Nesnelerin nasıl birleştirildiği | Adapter, Decorator, Composite |
| Davranışsal | Nesnelerin nasıl iletişim kurduğu | Observer, Strategy, Command |
Neden tasarım desenlerini öğrenmelisiniz? Diğer geliştiricilerle ortak bir kelime dağarcığına sahip olmanızı sağlarlar; "burada bir Factory kullan" demek, karmaşık bir fikri anında iletir. Ayrıca, "bir uygulamaya değil, bir arayüze göre programla" gibi ilkeleri uygulayarak daha esnek ve bakımı kolay kodlar yazmanıza yardımcı olurlar.
Gelecek derslerde, Singleton ve Factory gibi oluşturucu (creational) desenlerle başlayıp, ardından Observer ve Strategy gibi davranışsal (behavioral) desenlere geçerek birkaç temel deseni uygulayacaksınız.
Görev
KolayÜç tasarım deseni kategorisi hakkındaki anlayışınızı gösteren basit bir desen sınıflandırıcı oluşturalım! Desenleri kategorize eden ve amaçlarını açıklayan bir sistem oluşturacak, kodunuzu birden fazla dosya halinde düzenleyeceksiniz.
Üç dosya oluşturacaksınız:
Pattern.java: Tüm tasarım desenleri için sözleşmeyi tanımlayanPatternadında bir arayüz (interface) oluşturun. Arayüzünüz iki metot bildirmelidir: desenin kategorisini (Creational, Structural veya Behavioral) döndürenString getCategory()ve bu desen kategorisinin ne yaptığının açıklamasını döndürenString getPurpose().PatternInfo.java:Patternarayüzünüzü uygulayan (implement) ve her biri bir tasarım deseni kategorisini temsil eden üç sınıf oluşturun:CreationalPattern- kategori için"Creational"ve amaç için"How objects are created"döndürmelidir.StructuralPattern- kategori için"Structural"ve amaç için"How objects are composed"döndürmelidir.BehavioralPattern- kategori için"Behavioral"ve amaç için"How objects communicate"döndürmelidir.Main.java: Desen sınıflandırıcınızı bir araya getirin! Bir girdi alacaksınız:"Singleton","Factory","Adapter","Decorator","Observer"veya"Strategy"değerlerinden biri olan bir desen adı (String).Girdiye bağlı olarak uygun desen nesnesini oluşturun:
"Singleton"ve"Factory"Creational desenlerdir"Adapter"ve"Decorator"Structural desenlerdir"Observer"ve"Strategy"Behavioral desenlerdir
Desen nesnenizi
Pattern(arayüz) tipinde bir değişkende saklayarak bir arayüze göre programlama ilkesini gösterin. Ardından şu üç satırı yazdırın:Pattern: [input pattern name]Category: [category from getCategory()]Purpose: [purpose from getPurpose()]
Bir girdi alacaksınız: bir tasarım deseninin adı (String).
Bu meydan okuma, dersteki temel bilgiyi pekiştirir: tasarım desenleri, hangi sorunu çözdüklerine bağlı olarak kategorilere ayrılır. Bir arayüz kullanarak, aynı zamanda tasarım desenlerini bu kadar güçlü kılan temel bir kavram olan "bir uygulamaya değil, bir arayüze göre programlama" ilkesini de uygulamış oluyorsunuz!
Kopya kağıdı
Tasarım desenleri, yazılım geliştirmedeki yaygın sorunlara yönelik kanıtlanmış çözümlerdir. Belirli türdeki sorunları çözmek için sınıfların ve nesnelerin nasıl yapılandırılacağını açıklayan taslaklardır.
Tasarım desenleri üç ana kategoriye ayrılır:
| Kategori | Amaç | Örnekler |
|---|---|---|
| Yaratımsal (Creational) | Nesnelerin nasıl oluşturulduğu | Singleton, Factory, Builder |
| Yapısal (Structural) | Nesnelerin nasıl birleştirildiği | Adapter, Decorator, Composite |
| Davranışsal (Behavioral) | Nesnelerin nasıl iletişim kurduğu | Observer, Strategy, Command |
Tasarım desenleri, geliştiriciler arasında ortak bir kelime dağarcığı sağlar ve "bir uygulamaya değil, bir arayüze göre programla" gibi ilkeleri uygulayarak daha esnek, bakımı kolay kodlar yazmaya yardımcı olur.
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String patternName = scanner.nextLine();
// TODO: Pattern türünde (arayüz) bir değişken bildirin
Pattern pattern = null;
// TODO: patternName'e göre uygun desen nesnesini oluşturun:
// - "Singleton" ve "Factory" Creational (Yaratımsal) desenlerdir
// - "Adapter" ve "Decorator" Structural (Yapısal) desenlerdir
// - "Observer" ve "Strategy" Behavioral (Davranışsal) desenlerdir
// TODO: Çıktıyı aşağıdaki formatta yazdırın:
// Pattern: [giriş desen adı]
// Category: [getCategory() metodundan gelen kategori]
// Purpose: [getPurpose() metodundan gelen amaç]
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı