CodeBlanks Logo Icon CodeBlanks

Özet - Tasarım desenleri

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

main.cpp
#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

main.cpp
#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

Soru
auto d = ____("ten");
Cevap
auto d = createDiscount("ten");

Açıklama: createDiscount Factory metodudur; strateji üretir.

İleri seviye bölümündeki tüm dersler