Template Method Pattern (Şablon Yöntemi Tasarım Kalıbı), bir algoritmanın temel yapısını belirleyerek alt sınıfların belirli adımları kendilerine özgü şekilde uygulamalarına olanak tanıyan bir davranışsal tasarım desenidir.
Bu desen, bir şablon yöntem (template method) tanımlar ve algoritmanın belirli adımlarını alt sınıflara bırakırken, temel işlemi üst sınıfta korur.
Ne Zaman Kullanılmalıdır?
Template Method Pattern şu durumlarda kullanışlıdır:
- Belirli adımları aynı olan ancak iç detayları farklı olan algoritmaların uygulanması gerektiğinde.
- Alt sınıfların algoritmanın yapısını bozmadan belirli adımları değiştirmesine izin vermek gerektiğinde.
- Kod tekrarını önleyerek, ortak işlemleri üst sınıfta toplamak istendiğinde.
- Algoritmanın genişletilebilir olmasını sağlamak gerektiğinde.
Template Method Pattern’in Avantajları ve Dezavantajları
Avantajlar:
- Kod tekrarını azaltır: Ortak işlemleri üst sınıfta toplar.
- Esnekliği artırır: Alt sınıfların yalnızca ihtiyaç duydukları kısımları değiştirmesine olanak tanır.
- Algoritmayı kontrol altında tutar: Temel akış üst sınıfta korunur.
Dezavantajlar:
- Kodun soyutluğu artabilir: Alt sınıfların davranışı üst sınıftan geldiği için, anlaşılırlık bazen zorlaşabilir.
- Değişikliklerin etkisini görmek zor olabilir: Üst sınıfta yapılan bir değişiklik, birçok alt sınıfı etkileyebilir.
Template Method Pattern Kullanım Biçimleri
1. Template Method Arayüzü ve Concrete Subclass Sınıfları
// Şablon Sınıf (Abstract Class)
abstract class MealPreparation {
// Şablon Yöntem (Template Method)
public final void prepareMeal() {
buyIngredients();
cook();
serve();
}
// Ortak adım
private void buyIngredients() {
System.out.println("Malzemeler satın alınıyor...");
}
// Alt sınıfların özelleştireceği adım
protected abstract void cook();
// Ortak adım
private void serve() {
System.out.println("Yemek servise hazır!");
}
}
// Concrete Class: Pizza Hazırlama
class PizzaPreparation extends MealPreparation {
@Override
protected void cook() {
System.out.println("Pizza fırında pişiriliyor...");
}
}
// Concrete Class: Makarna Hazırlama
class PastaPreparation extends MealPreparation {
@Override
protected void cook() {
System.out.println("Makarna haşlanıyor ve sos ekleniyor...");
}
}
2. Kullanım
public class Main {
public static void main(String[] args) {
MealPreparation pizza = new PizzaPreparation();
pizza.prepareMeal();
System.out.println("--------------------");
MealPreparation pasta = new PastaPreparation();
pasta.prepareMeal();
}
}
Çıktı:
Malzemeler satın alınıyor...
Pizza fırında pişiriliyor...
Yemek servise hazır!
--------------------
Malzemeler satın alınıyor...
Makarna haşlanıyor ve sos ekleniyor...
Yemek servise hazır!
Gerçek Dünya Senaryosu: Belge Oluşturma Süreci
// Şablon Sınıf
abstract class DocumentGenerator {
public final void generateDocument() {
openDocument();
writeContent();
closeDocument();
}
private void openDocument() {
System.out.println("Belge açılıyor...");
}
protected abstract void writeContent();
private void closeDocument() {
System.out.println("Belge kapatılıyor...");
}
}
// Concrete Class: PDF Belgesi
class PDFGenerator extends DocumentGenerator {
@Override
protected void writeContent() {
System.out.println("PDF içeriği oluşturuluyor...");
}
}
// Concrete Class: Word Belgesi
class WordGenerator extends DocumentGenerator {
@Override
protected void writeContent() {
System.out.println("Word içeriği oluşturuluyor...");
}
}
Kullanım
public class Main {
public static void main(String[] args) {
DocumentGenerator pdf = new PDFGenerator();
pdf.generateDocument();
System.out.println("--------------------");
DocumentGenerator word = new WordGenerator();
word.generateDocument();
}
}
Çıktı:
Belge açılıyor...
PDF içeriği oluşturuluyor...
Belge kapatılıyor...
--------------------
Belge açılıyor...
Word içeriği oluşturuluyor...
Belge kapatılıyor...
Sonuç
Template Method Pattern, ortak işlemleri belirli bir çatı altında toplayarak, alt sınıfların belirli adımları kendilerine özgü şekilde uygulamasına olanak tanır. Gerçek dünyada şu senaryolarda yaygın olarak kullanılır:
- Veri işleme süreçleri (Farklı formatlardaki dosyaların işlenmesi)
- Rapor oluşturma sistemleri (PDF, Word, Excel raporları)
- Oyun geliştirme (Farklı seviyelerde farklı kurallar uygulama)
- Web tarayıcıları (Farklı sayfa yükleme mekanizmaları)
Template Method Pattern sayesinde, kod tekrarını azaltarak daha modüler ve sürdürülebilir bir yapı oluşturulabilir. 🚀