C#
Özet - Tasarım desenleri
Singleton, Factory ve Strategy'i birleştirerek bir ödeme sistemi yazarsın.
Beş deseni hatırla
Bu grupta beş desen gördük: Singleton tek örnek; Factory nesne yaratma; Strategy algoritma seçimi; Observer değişim bildirimi; Decorator sarmalayarak genişletme. Her desen farklı bir sorunu çözer; seçim soruna bağlıdır.
Şimdi iki derste bu desenlerden ikisini birleştireceğiz: önce Singleton + Factory, sonra Singleton + Observer. Amaç, desenlerin nasıl bir arada çalıştığını görmek.
Uygulama ConfigStore: Singleton + Factory
sealed class ConfigStore tanımla: özel kurucu, static readonly _instance alanı, public static ConfigStore Instance özelliği ve public string Create(string type) fabrika metodu olsun. Create metodu type parametresine göre "url" ise "https://example.com", "title" ise "Uygulama", aksi halde boş dize döndürsün. Main'de ConfigStore.Instance.Create("title") sonucunu yazdır.
Örnek çözümü göster
//example.com", "title" => "Uygulama", _ => "" }; yaz. Main'de Console.WriteLine(ConfigStore.Instance.Create("title"));
Örnek çözüm:
using System;
sealed class ConfigStore
{
private static readonly ConfigStore _instance = new ConfigStore();
public static ConfigStore Instance => _instance;
private ConfigStore() { }
public string Create(string type) =>
type switch
{
"url" => "https://example.com",
"title" => "Uygulama",
_ => ""
};
}
class Program
{
static void Main()
{
Console.WriteLine(ConfigStore.Instance.Create("title"));
}
}
Uygulama Logger: Singleton + Observer
sealed class Logger tanımla: özel kurucu, static readonly _instance, public static Logger Instance ve public event EventHandler<string> MessageLogged olsun. Log(string message) metodu MessageLogged?.Invoke(this, message) çağrısı yapsın. class LoggerMonitor kurucusunda Logger.Instance.MessageLogged olayına lambda ile abone olup "Kayıt: " + msg yazsın. Main'de new LoggerMonitor() oluştur ve Logger.Instance.Log("Sistem açıldı") çağır.
Örnek çözümü göster
sealed class Logger { private static readonly Logger _instance = new Logger(); public static Logger Instance => _instance; private Logger() { } public event EventHandler<string> MessageLogged; public void Log(string message) => MessageLogged?.Invoke(this, message); } tanımla. class LoggerMonitor { public LoggerMonitor() => Logger.Instance.MessageLogged += (s, msg) => Console.WriteLine("Kayıt: " + msg); } yaz. Main'de: var m = new LoggerMonitor(); Logger.Instance.Log("Sistem açıldı");
Örnek çözüm:
using System;
sealed class Logger
{
private static readonly Logger _instance = new Logger();
public static Logger Instance => _instance;
private Logger() { }
public event EventHandler<string> MessageLogged;
public void Log(string message) => MessageLogged?.Invoke(this, message);
}
class LoggerMonitor
{
public LoggerMonitor() =>
Logger.Instance.MessageLogged += (s, msg) =>
Console.WriteLine("Kayıt: " + msg);
}
class Program
{
static void Main()
{
var monitor = new LoggerMonitor();
Logger.Instance.Log("Sistem açıldı");
}
}
Kendini test et
-
Deseni kullanım alanıyla eşleştir
- Singleton
- Tek örnek garantisi
- Factory
- Nesne yaratma
- Strategy
- Algoritma seçimi
- Observer
- Değişim bildirimi
- Decorator
- Sarmalayarak genişletme
-
Tek örnek garantisi hangi desenle sağlanır?
- Observer
- Singleton
- Decorator
- Strategy
Cevabı göster
Singleton — Doğru. Singleton tek örnek sağlar.
Sıradaki ders: xUnit nedir?