Soyut Fabrika’ya (Abstract Factory) benzer biçimde, ilgili veya bağımlı nesneler serisi oluşturmak için kullanılır. Bu desen ile Soyut Fabrika deseni arasındaki fark, bu desenin oluşturabileceği her türlü nesneyi oluşturmak için yalnızca bir statik metodu kullanmasıdır. Metodlar ise genellikle factory, build veya create olarak adlandırılır.
<?php // StaticFactory.php declare(strict_types=1); namespace DesignPatterns\Creational\StaticFactory; use InvalidArgumentException; /** * Note1: Remember, static means global state which is evil because it can't be mocked for tests * Note2: Cannot be subclassed or mock-upped or have multiple different instances. */ final class StaticFactory { public static function factory(string $type): Formatter { if ($type == 'number') { return new FormatNumber(); } elseif ($type == 'string') { return new FormatString(); } throw new InvalidArgumentException('Unknown format given'); } } // Formatter.php declare(strict_types=1); namespace DesignPatterns\Creational\StaticFactory; interface Formatter { public function format(string $input): string; } // FormatString.php declare(strict_types=1); namespace DesignPatterns\Creational\StaticFactory; class FormatString implements Formatter { public function format(string $input): string { return $input; } } // FormatNumber.php declare(strict_types=1); namespace DesignPatterns\Creational\StaticFactory; class FormatNumber implements Formatter { public function format(string $input): string { return number_format((int) $input); } }
Örneğe ait Test;
<?php Tests/StaticFactoryTest.php declare(strict_types=1); namespace DesignPatterns\Creational\StaticFactory\Tests; use InvalidArgumentException; use DesignPatterns\Creational\StaticFactory\FormatNumber; use DesignPatterns\Creational\StaticFactory\FormatString; use DesignPatterns\Creational\StaticFactory\StaticFactory; use PHPUnit\Framework\TestCase; class StaticFactoryTest extends TestCase { public function testCanCreateNumberFormatter() { $this->assertInstanceOf(FormatNumber::class, StaticFactory::factory('number')); } public function testCanCreateStringFormatter() { $this->assertInstanceOf(FormatString::class, StaticFactory::factory('string')); } public function testException() { $this->expectException(InvalidArgumentException::class); StaticFactory::factory('object'); } }
İlk Yorumu Siz Yapın