İlgili veya bağımlı nesneler dizisini somut sınıflarını belirtmeden oluşturmak için kullanılır. Genellikle oluşturulan sınıfların tümü aynı interface’i uygular. Abstract Factory(Soyut fabrikanın) client’ı nesnelerin nasıl oluşturulduğuyla ilgilenmez, sadece nasıl birlikte kullanıldıklarını bilir. Örnek üzerinden devam edelim;

Örneğin kodları ise şu şekilde;
<?php // WriterFactory.php namespace DesignPatterns\Creational\AbstractFactory; interface WriterFactory { public function createCsvWriter(): CsvWriter; public function createJsonWriter(): JsonWriter; } // CsvWriter.php namespace DesignPatterns\Creational\AbstractFactory; interface CsvWriter { public function write(array $line): string; } // JsonWriter.php namespace DesignPatterns\Creational\AbstractFactory; interface JsonWriter { public function write(array $data, bool $formatted): string; } // UnixCsvWriter.php namespace DesignPatterns\Creational\AbstractFactory; class UnixCsvWriter implements CsvWriter { public function write(array $line): string { return join(',', $line) . "\n"; } } // UnixJsonWriter.php namespace DesignPatterns\Creational\AbstractFactory; class UnixJsonWriter implements JsonWriter { public function write(array $data, bool $formatted): string { $options = 0; if ($formatted) { $options = JSON_PRETTY_PRINT; } return json_encode($data, $options); } } // UnixWriterFactory.php namespace DesignPatterns\Creational\AbstractFactory; class UnixWriterFactory implements WriterFactory { public function createCsvWriter(): CsvWriter { return new UnixCsvWriter(); } public function createJsonWriter(): JsonWriter { return new UnixJsonWriter(); } } // WinCsvWriter.php namespace DesignPatterns\Creational\AbstractFactory; class WinCsvWriter implements CsvWriter { public function write(array $line): string { return join(',', $line) . "\r\n"; } } // WinJsonWriter.php namespace DesignPatterns\Creational\AbstractFactory; class WinJsonWriter implements JsonWriter { public function write(array $data, bool $formatted): string { return json_encode($data, JSON_PRETTY_PRINT); } } // WinWriterFactory.php namespace DesignPatterns\Creational\AbstractFactory; class WinWriterFactory implements WriterFactory { public function createCsvWriter(): CsvWriter { return new WinCsvWriter(); } public function createJsonWriter(): JsonWriter { return new WinJsonWriter(); } }
Bu örneğin Test işlemleri de şu şekildedir;
<?php // Tests/AbstractFactoryTest.php declare(strict_types=1); namespace DesignPatterns\Creational\AbstractFactory\Tests; use DesignPatterns\Creational\AbstractFactory\CsvWriter; use DesignPatterns\Creational\AbstractFactory\JsonWriter; use DesignPatterns\Creational\AbstractFactory\UnixWriterFactory; use DesignPatterns\Creational\AbstractFactory\WinWriterFactory; use DesignPatterns\Creational\AbstractFactory\WriterFactory; use PHPUnit\Framework\TestCase; class AbstractFactoryTest extends TestCase { public function provideFactory() { return [ [new UnixWriterFactory()], [new WinWriterFactory()] ]; } /** * @dataProvider provideFactory */ public function testCanCreateCsvWriterOnUnix(WriterFactory $writerFactory) { $this->assertInstanceOf(JsonWriter::class, $writerFactory->createJsonWriter()); $this->assertInstanceOf(CsvWriter::class, $writerFactory->createCsvWriter()); } }
İlk Yorumu Siz Yapın