Template Design Pattern – C#
Template Design Pattern, bir algoritmanın ana yapısını (iskeletini) tanımlayan ve belirli adımların alt sınıflar tarafından özelleştirilmesine olanak tanıyan bir davranışsal (behavioral) tasarım desenidir.
Bu desen, algoritmanın ortak adımlarını üst sınıfta tanımlar ve özelleştirilmesi gereken adımları alt sınıflara bırakır.
Template Design Pattern Avantajları
- Esneklik: Alt sınıflar, şablonun belirli adımlarını özelleştirerek farklı davranışlar sağlayabilir. Bu, aynı algoritmanın farklı varyasyonlarını kolayca oluşturmayı mümkün kılar.
- Kod Tekrarını Azaltır: Ortak işlemler üst sınıfta bir kez tanımlandığı için aynı işlemi farklı şekillerde uygulayan sınıflar arasında kod tekrarını önler.
- Kolay Genişletilebilirlik: Yeni bir davranış eklemek gerektiğinde, mevcut üst sınıfı değiştirmeden yeni bir alt sınıf eklenebilir. Bu, yazılımın genişletilmesini daha kolay ve güvenli hale getirir.
- Algoritmanın İskeleti Korunur: Algoritmanın genel yapısı üst sınıfta sabit tutulur, böylece alt sınıflar yalnızca gerekli adımları özelleştirir. Bu, algoritmanın tutarlılığını ve güvenilirliğini sağlar.
- Bakım Kolaylığı: Algoritmanın genel işleyişi merkezi bir yerde tanımlandığından, yapılan değişiklikler tüm alt sınıflara otomatik olarak yansır. Bu, bakım sürecini hızlandırır ve hata riskini azaltır.
Bu projede, farklı veri kaynaklarından (Configuration Dosyası ve Veritabanı) veri okuma işlemini Template Design Pattern ile ele alıyoruz.
Senaryo:
- Farklı kaynaklardan veri okunması gerekiyor:
- Configuration dosyası: Uygulama ayarlarının okunması
- Veritabanı: SQL sorguları ile veri çekilmesi
- Her iki işlem de aynı genel adımları içerir:
- Bağlantı kurma
- Veriyi okuma
- Bağlantıyı kapatma
- Ancak, bu adımların içeriği veri kaynağına göre değişir.
UML Diagram

Code Structure
DataReader
: Abstract sınıf. Veri okuma işleminin ana iskeletini tanımlar (ReadData()
metodu). Alt sınıflarınConnect()
veFetchData()
metodlarını uygulaması beklenir.ConfigFileReader
: Configuration dosyasından veri okumayı gerçekleştiren sınıf.DatabaseReader
: Veritabanından veri okumayı gerçekleştiren sınıf.
1-) DataReader
public abstract class DataReader
{
public void ReadData()
{
Connect();
FetchData();
Disconnect();
}
protected abstract void Connect();
protected abstract void FetchData();
protected virtual void Disconnect()
{
Console.WriteLine("Bağlantı kapatıldı.");
}
}
2-) Concrete
public class ConfigFileReader : DataReader
{
protected override void Connect()
{
Console.WriteLine("Configuration dosyasına bağlanılıyor...");
}
protected override void FetchData()
{
Console.WriteLine("Configuration dosyasından veri okundu: 'AppSettings:ApiKey=12345'");
}
}
//----------
public class DatabaseReader : DataReader
{
protected override void Connect()
{
Console.WriteLine("Veritabanına bağlanılıyor...");
}
protected override void FetchData()
{
Console.WriteLine("Veritabanından veri okundu: 'SELECT * FROM Users'");
}
// Veritabanı özel bir kapatma işlemi gerektiriyor
protected override void Disconnect()
{
Console.WriteLine("Veritabanı bağlantısı güvenli bir şekilde kapatıldı.");
}
}
Uygulama ve Sonuç
Console.WriteLine("Configuration Dosyasından Veri Okuma:");
DataReader configReader = new ConfigFileReader();
configReader.ReadData();
Console.WriteLine("\nVeritabanından Veri Okuma:");
DataReader dbReader = new DatabaseReader();
dbReader.ReadData();
