Özet - Tasarım desenleri
- C++ kursu
- İleri seviye
- Ders 36/83
- 5 dk
Singleton, Factory ve Strategy'i birleştirerek bir ödeme sistemi yazarsın.
Özet: desenleri birleştir
Bu özette üç deseni bir ödeme sisteminde birleştireceksin. Singleton ile tek bir loglayıcı (logger), Factory ile istenen indirim türünü üreten metot, Strategy ile farklı indirim algoritmaları kullanacaksın.
Logger tek örnek olmalı çünkü tüm ödemeler aynı kaynağa yazmalı. Discount soyut sınıfı indirim stratejisidir; NoDiscount ve TenPercent alt sınıfları farklı algoritmalar uygular. createDiscount("ten") çağrısı doğru stratejiyi döndürür. Böylece desenler birlikte çalışır: Factory Strategy üretir, Singleton loglar.
Uygulama Ödeme sistemini yaz
Logger Singleton sınıfını tanımla; log(const std::string&) metodu std::cout << msg; yapsın. Discount soyut sınıfı virtual int apply(int price) const = 0; içersin. NoDiscount fiyatı olduğu gibi döndürsün; TenPercent price - price / 10 döndürsün. createDiscount(const std::string&) Factory metodu "ten" için TenPercent döndürsün. main içinde 100 birimlik fiyatı %10 indirimle hesaplayıp Logger'a yazdır (çıktı 90).
Başlangıç kodu
#include <iostream>
#include <memory>
#include <string>
// Logger Singleton sınıfını tanımla
// Discount soyut sınıfını ve NoDiscount/TenPercent sınıflarını tanımla
// createDiscount Factory metodunu ekle
int main() {
// 100 birimlik fiyatı TenPercent ile hesapla, Logger'a yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <memory>
#include <string>
class Logger {
public:
static Logger& instance() {
static Logger l;
return l;
}
void log(const std::string& msg) { std::cout << msg; }
private:
Logger() = default;
};
class Discount {
public:
virtual ~Discount() = default;
virtual int apply(int price) const = 0;
};
class NoDiscount : public Discount {
public:
int apply(int price) const override { return price; }
};
class TenPercent : public Discount {
public:
int apply(int price) const override { return price - price / 10; }
};
std::unique_ptr<Discount> createDiscount(const std::string& type) {
if (type == "ten") return std::make_unique<TenPercent>();
return std::make_unique<NoDiscount>();
}
int main() {
auto d = createDiscount("ten");
int total = d->apply(100);
Logger::instance().log(std::to_string(total));
return 0;
}Beklenen çıktı
90
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bu sistemde Logger neden Singleton?
- Daha hızlı çalışsın diye
- Tüm ödemeler aynı kaynağa yazsın diye Doğru cevap
- Daha az bellek tutsun diye
- Factory ile uyumlu olsun diye
Açıklama: Singleton tek loglayıcı sağlar; tüm kayıtlar aynı yere gider.
2 Deseni rolüne eşle
| Kavram | Anlamı |
|---|---|
Logger (Singleton) |
Tek loglayıcı |
createDiscount (Factory) |
Strateji üretir |
class Discount (Strategy) |
İndirim algoritması |
TenPercent |
Somut strateji |
3 createDiscount çağrısını tamamla
auto d = ____("ten");
auto d = createDiscount("ten");
Açıklama: createDiscount Factory metodudur; strateji üretir.