Oluşturucu Örüntüler: Factory, Builder, Singleton
Oluşturucu örüntülerle nesne oluşturmayı temiz biçimde denetleyin.
Oluşturucu Örüntüler: Factory, Builder, Singleton, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
Oluşturmayı denetleme
Oluşturma kalıpları, ihtiyaç duyduğunuz şeyle onun nasıl oluşturulduğunu birbirinden ayırır. Oluşturma koşulluysa, birden fazla adımdan oluşuyorsa veya merkezileştirilmesi gerekiyorsa, kod tabanının her yerine new serpiştirmek çağıranları somut sınıflara bağımlı hâle getirir. Burada Fabrika (ve Fabrika Yöntemi), karmaşık birleştirme için Builder ve Singleton'ı (çekinceleriyle birlikte) ele alacağız.
Basit Fabrika
Basit fabrika, bir oluşturma kararını tek bir yöntemin arkasında merkezileştirir. Çağıranlar mantıksal bir tür ister ve sınıf adlarını bilmeden yapılandırılmış somut bir örnek alır.
<?php
interface Notifier { public function send(string $msg): string; }
final class EmailNotifier implements Notifier {
public function send(string $m): string { return "email: $m"; }
}
final class SmsNotifier implements Notifier {
public function send(string $m): string { return "sms: $m"; }
}
final class NotifierFactory {
public static function make(string $channel): Notifier {
return match ($channel) {
'email' => new EmailNotifier(),
'sms' => new SmsNotifier(),
default => throw new InvalidArgumentException($channel),
};
}
}
echo NotifierFactory::make('sms')->send('Hi'), PHP_EOL;
Fabrika Yöntemi
Fabrika Yöntemi kalıbı, örnek oluşturma işini alt sınıflara bırakır. Temel sınıf, soyut bir create() çağıran algoritmayı tanımlar; her alt sınıf somut ürüne karar verir. Bu yaklaşım OCP ile uyumludur: mevcut oluşturucuları düzenlemeden yeni bir oluşturucu ekleyebilirsiniz.
<?php
abstract class ReportExporter {
abstract protected function create(): string;
public function export(): string {
return 'Exported as ' . $this->create();
}
}
final class PdfExporter extends ReportExporter {
protected function create(): string { return 'PDF'; }
}
final class CsvExporter extends ReportExporter {
protected function create(): string { return 'CSV'; }
}
echo (new PdfExporter())->export(), PHP_EOL;
echo (new CsvExporter())->export(), PHP_EOL;
Soyut Fabrika
Soyut Fabrika, birlikte kullanılması gereken ilişkili nesne aileleri üretir (örneğin bir MySqlConnection ve bir MySqlQueryBuilder). Tek bir fabrika bütün kümeyi ürettiği için parçaların uyumlu olmasını garanti eder. Bir ürün ailesinin kendi içinde tutarlı kalması gerektiğinde kullanın.
Builder: sorun
Bir nesnenin çok sayıda isteğe bağlı parametreye ihtiyacı olduğunda, kurucular okunması zor konumsal bağımsız değişken listelerine veya PHP'de bulunmayan, giderek uzayan aşırı yüklemelere dönüşür. Builder kalıbı, karmaşık bir nesneyi adım adım birleştirir ve sonunda tamamlanmış, geçerli bir ürün döndürür.
Akıcı Builder
Akıcı bir oluşturucu, her ayarlayıcıdan $this döndürür; ardından bir build() değişmez sonucu üretir. Böylece ürünün kendisi basit kalır ve birleştirme mantığı oluşturucuya taşınır.
<?php
final class Query {
public function __construct(public readonly string $sql) {}
}
final class QueryBuilder {
private string $table = '';
private array $where = [];
public function from(string $t): self { $this->table = $t; return $this; }
public function where(string $c): self { $this->where[] = $c; return $this; }
public function build(): Query {
$sql = "SELECT * FROM {$this->table}";
if ($this->where) { $sql .= ' WHERE ' . implode(' AND ', $this->where); }
return new Query($sql);
}
}
echo (new QueryBuilder())->from('users')->where('age > 18')->build()->sql, PHP_EOL;
Builder ve adlandırılmış kurucular
Daha basit durumlarda, PHP 8'in adlandırılmış bağımsız değişkenleri ve adlandırılmış kurucular (statik fabrika yöntemleri) çoğu zaman tam bir Builder kullanmaktan daha iyi bir seçenektir.
- Tüm veriler aynı anda mevcutsa adlandırılmış bağımsız değişkenleri kullanın.
- Birleştirme birden fazla adımdan oluşuyorsa, koşulluysa veya farklı çağrı noktalarında yeniden kullanılıyorsa Builder kullanın.
<?php
final class Money {
private function __construct(public readonly int $cents, public readonly string $cur) {}
public static function fromDollars(float $d): self {
return new self((int) round($d * 100), 'USD');
}
public static function zero(string $cur = 'USD'): self {
return new self(0, $cur);
}
}
var_dump(Money::fromDollars(19.99)->cents); // int(1999)
Singleton
Singleton, genel bir erişim noktasıyla tek bir örneği garanti eder. Bunu özel bir kurucu ve statik bir erişimciyle uygulayın. Gerçekten bir süreç içinde benzersiz olması gereken şeyler için yararlı olabilir; ancak aynı zamanda en çok kötüye kullanılan kalıptır.
<?php
final class Config {
private static ?self $instance = null;
private array $data = ['debug' => true];
private function __construct() {}
public static function instance(): self {
return self::$instance ??= new self();
}
public function get(string $k): mixed { return $this->data[$k] ?? null; }
}
var_dump(Config::instance()->get('debug'));
var_dump(Config::instance() === Config::instance()); // true
Singleton neden sorun çıkarır
Singleton'lar gizli küresel durum oluşturur: çağıranlar bağımlılığı bildirmek yerine Config::instance() üzerinden ona ulaşır; bu da sınanabilirliği ve paralel çalışmayı bozar. Modern PHP'de tek bir paylaşılan örneği bir DI konteynerine ("tek örnek" yaşam döngüsüyle) kaydedip onu bağımlılık olarak aktarın. Küresel bağımlılık olmadan tek bir örnek elde edersiniz.
Doğru aracı seçme
- Basit/Fabrika Yöntemi: somut sınıfları bir oluşturma kararının arkasına gizler.
- Soyut Fabrika: uyumlu ürün aileleri üretir.
- Builder: karmaşık nesneleri adım adım birleştirir.
- Singleton: son çare olarak kullanın; konteyner tarafından yönetilen paylaşımlı hizmetleri tercih edin.
Bu dört yaklaşımın tümü somut kuruculara olan bağımlılığı azaltır ve kodun genişletilmesini ve sınanmasını kolaylaştırır.
Kayıt defteri tabanlı fabrika
Daha dinamik bir fabrika, oluşturucuları bir kayıt defterinde arar; böylece yeni türler fabrikayı düzenlemeden kendilerini kaydedebilir (gerçek OCP). Eklenti sistemleri ve serileştiriciler, çalışma zamanında bir tür adını kurucuya çözümlemek için bu yöntemi kullanır.
<?php
interface Shape { public function name(): string; }
final class Circle implements Shape { public function name(): string { return 'circle'; } }
final class Square implements Shape { public function name(): string { return 'square'; } }
final class ShapeRegistry {
private array $creators = [];
public function register(string $key, callable $factory): void {
$this->creators[$key] = $factory;
}
public function create(string $key): Shape {
return ($this->creators[$key] ?? throw new InvalidArgumentException($key))();
}
}
$r = new ShapeRegistry();
$r->register('circle', fn() => new Circle());
$r->register('square', fn() => new Square());
echo $r->create('square')->name(), PHP_EOL; // square
Hızlı Kontrol
Senaryo için en uygun oluşturma aracını seçin.
Özet
Oluşturma kalıplarıyla nesne oluşturmayı denetlediniz: somut türleri gizlemek ve ürün ailelerini seçmek için fabrikaları, karmaşık nesneleri akıcı biçimde birleştirmek için oluşturucuları kullandınız ve Singleton'ın ödünlerini gördünüz. Modern yaklaşım şudur: fabrikaları ve Builder'ı çekinmeden tercih edin; ancak bağımlılıkları açık ve sınanabilir tutmak için Singleton yerine bir DI konteynerinin paylaşılan örnek yaşam döngüsünü kullanın.
Sıkça Sorulan Sorular
“Oluşturucu Örüntüler: Factory, Builder, Singleton” dersi ücretsiz mi?
Evet — “Oluşturucu Örüntüler: Factory, Builder, Singleton” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“Oluşturucu Örüntüler: Factory, Builder, Singleton” dersinde ne öğreneceğim?
Oluşturucu örüntülerle nesne oluşturmayı temiz biçimde denetleyin. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Oluşturucu Örüntüler: Factory, Builder, Singleton” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- SOLID İlkelerini Uygulamada Kullanma
- Oluşturucu Örüntüler: Factory, Builder, Singleton
- Yapısal Örüntüler: Adapter, Decorator, Facade
- Davranışsal Örüntüler: Strategy, Observer, Command