Factory Method(Fabrika Yöntemi) kendisini alt sınıflarla genişleterek (subclassing) farklı biçimlerde nesne oluşturabilmeyi sağlar.
Basit durumlarda soyut sınıf sadece bir interface(arayüz) olabilir.
Bu desen “gerçek” bir Tasarım Deseni’dir, çünkü S.O.L.I.D ilkelerinden biri olan “D” yani “Dependency Inversion Principle (Bağımlılık Tersinme İlkesi)” bölümünün sorumluluğunu yerine getirir.
Bu, Factory Method sınıfının somut sınıflara değil soyutlamalara (abstraction) dayandığı anlamına gelir.
Örnek kodlarla devam edelim;
<?php // Logger.php declare(strict_types=1); namespace DesignPatterns\Creational\FactoryMethod; interface Logger { public function log(string $message); } // StdoutLogger.php declare(strict_types=1); namespace DesignPatterns\Creational\FactoryMethod; class StdoutLogger implements Logger { public function log(string $message) { echo $message; } } // FileLogger.php declare(strict_types=1); namespace DesignPatterns\Creational\FactoryMethod; class FileLogger implements Logger { public function __construct(private string $filePath) { } public function log(string $message) { file_put_contents($this->filePath, $message . PHP_EOL, FILE_APPEND); } } // LoggerFactory.php declare(strict_types=1); namespace DesignPatterns\Creational\FactoryMethod; interface LoggerFactory { public function createLogger(): Logger; } // StdoutLoggerFactory.php declare(strict_types=1); namespace DesignPatterns\Creational\FactoryMethod; class StdoutLoggerFactory implements LoggerFactory { public function createLogger(): Logger { return new StdoutLogger(); } } // FileLoggerFactory.php declare(strict_types=1); namespace DesignPatterns\Creational\FactoryMethod; class FileLoggerFactory implements LoggerFactory { public function __construct(private string $filePath) { } public function createLogger(): Logger { return new FileLogger($this->filePath); } }
Bu örneğe ait Test sınıfı;
<?php // Tests/FactoryMethodTest.php declare(strict_types=1); namespace DesignPatterns\Creational\FactoryMethod\Tests; use DesignPatterns\Creational\FactoryMethod\FileLogger; use DesignPatterns\Creational\FactoryMethod\FileLoggerFactory; use DesignPatterns\Creational\FactoryMethod\StdoutLogger; use DesignPatterns\Creational\FactoryMethod\StdoutLoggerFactory; use PHPUnit\Framework\TestCase; class FactoryMethodTest extends TestCase { public function testCanCreateStdoutLogging() { $loggerFactory = new StdoutLoggerFactory(); $logger = $loggerFactory->createLogger(); $this->assertInstanceOf(StdoutLogger::class, $logger); } public function testCanCreateFileLogging() { $loggerFactory = new FileLoggerFactory(sys_get_temp_dir()); $logger = $loggerFactory->createLogger(); $this->assertInstanceOf(FileLogger::class, $logger); } }
İlk Yorumu Siz Yapın