Özet - Tasarım desenleri
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
-
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.
-
Sepet desenlerini eşleştir
- Singleton
- tek sepet
- Factory
- ödeme yöntemi üretir
- Strategy
- ödeme algoritması
- Builder
- fluent kurucu