CodeBlanks Logo Icon CodeBlanks

Özet - Tasarım desenleri

PHP kursu · İleri seviye · Ders 87/92

Singleton, Factory ve Strategy'le ödeme yöntemi seçilebilen sepet sistemi yazarsın.

Özet - Sepet sistemi

Bu özette dört deseni bir sepet sisteminde birleştiriyoruz. Singleton tek sepet örneğini guarantee eder; Factory ödeme yöntemini üretir; Strategy ödemenin nasıl yapılacağını belirler; Builder sepetteki öğeleri fluent yöntemlerle kurar.

Her desen kendi sorumluluğunu taşır: ayrıştırmayı (separation of concerns) sağlar. Önce Builder ile sepeti kuracak, sonra Singleton + Factory + Strategy ile ödeme işlemini gerçekleştireceksin.

Builder deseni: fluent kurucu

Builder deseni karmaşık bir nesneyi adım adım kurmayı sağlar. Her kurucu yöntem (örneğin addItem, setPayment) nesnenin bir parçasını ayarlar ve return $this; ile kendini döndürür; böylece çağrılar zincirlenir.

En son build yöntemi hazır nesneyi verir. Bu, çok sayıda kurucu parametresi olan sınıfları okunabilir tutar; sepette öğe ekle, ödeme ayarla, sonra build ile sonucu al.

Uygulama Builder ile sepeti fluent kur

Bir Builder sınıfı yaz. addItem(string $name, int $price) ve setPayment(string $payment) yöntemleri return $this; ile kendini döndürsün. build yöntemi öğelerin fiyat toplamını hesaplayıp ['total' => $total] döndürsün. addItem('ekmek', 10), addItem('süt', 20), setPayment('card') ile sepeti kur ve toplam değerini yazdır.

Örnek çözümü göster
class Builder yaz; addItem ve setPayment self döndürsün (return $this;). build öğelerin price toplamını hesaplayıp dizi döndürür. (new Builder())->addItem('ekmek', 10)->addItem('süt', 20)->setPayment('card')->build() ile kur.
Örnek çözüm:
<?php
class Builder {
    private array $items = [];
    private string $payment = '';
    public function addItem(string $name, int $price): self {
        $this->items[] = ['name' => $name, 'price' => $price];
        return $this;
    }
    public function setPayment(string $payment): self {
        $this->payment = $payment;
        return $this;
    }
    public function build(): array {
        $total = 0;
        foreach ($this->items as $i) { $total += $i['price']; }
        return ['items' => $this->items, 'payment' => $this->payment, 'total' => $total];
    }
}
$cart = (new Builder())
    ->addItem('ekmek', 10)
    ->addItem('süt', 20)
    ->setPayment('card')
    ->build();
echo 'toplam: ' . $cart['total'];

Uygulama Singleton + Factory + Strategy ile ödeme

Bir Algorithm arayüzü yaz (pay(int $amount): string yöntemi olsun). CardStrategy 'ödendi: ' . $amount döndürsün. Bir Factory sınıfı yaz; createProduct('card') bir CardStrategy örneği döndürsün. Bir Singleton sınıfı yaz; getInstance tek örneği versin ve checkout(int $amount, Algorithm $algo) yöntemi $algo->pay($amount) sonucunu döndürsün. Sepeti al, kart stratejisi üret, checkout(30, $pay) ile öde ve sonucu yazdır.

Örnek çözümü göster
string; } yaz. CardStrategy pay ile 'ödendi: ' . $amount döndürür. Factory::createProduct('card') CardStrategy döndürür. Singleton::getInstance() tek örneği verir; checkout(30, $pay) $algo->pay($amount) döndürür.
Örnek çözüm:
<?php
interface Algorithm {
    public function pay(int $amount): string;
}
class CardStrategy implements Algorithm {
    public function pay(int $amount): string { return 'ödendi: ' . $amount; }
}
class Factory {
    public static function createProduct(string $type): Algorithm {
        return match ($type) {
            'card' => new CardStrategy(),
            default => throw new \InvalidArgumentException('bilinmiyor'),
        };
    }
}
class Singleton {
    private static ?Singleton $instance = null;
    private function __construct() {}
    public static function getInstance(): Singleton {
        return self::$instance ??= new Singleton();
    }
    public function checkout(int $amount, Algorithm $algo): string {
        return $algo->pay($amount);
    }
}
$cart = Singleton::getInstance();
$pay = Factory::createProduct('card');
echo $cart->checkout(30, $pay);

Kendini test et

  1. Sepette tek örnek guarantee eden desen hangisi?

    • Strategy
    • Factory
    • Builder
    • Singleton
    Cevabı göster

    Singleton — Doğru. Singleton tek örnek guarantee eder; sepet için uygundur.

  2. Sepet desenlerini eşleştir

    Singleton
    tek sepet
    Factory
    ödeme yöntemi üretir
    Strategy
    ödeme algoritması
    Builder
    fluent kurucu

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