創(chuàng)建一系列互相關(guān)聯(lián)或依賴的對象時,不指定他們具體的類。因為這些創(chuàng)建的類通常都實現(xiàn)了同一個接口。抽象工廠的客戶端并不關(guān)心對象是如何創(chuàng)建的,而只知道它們是怎樣組合的。
WriterFactory.php
<?php
namespace DesignPatterns\Creational\AbstractFactory;
interface WriterFactory{
public function createCsvWriter(): CsvWriter;
public function createJsonWriter(): JsonWriter;
}
CsvWriter.php
<?php
namespace DesignPatterns\Creational\AbstractFactory;
interface CsvWriter{
public function write(array $line): string;
}
JsonWriter.php
<?php
namespace DesignPatterns\Creational\AbstractFactory;
interface JsonWriter{
public function write(array $data, bool $formatted): string;
}
UnixCsvWriter.php
<?php
namespace DesignPatterns\Creational\AbstractFactory;
class UnixCsvWriter implements CsvWriter{
public function write(array $line): string{
return join(',', $line) . "\n";
}
}
UnixJsonWriter.php
<?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
<?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
<?php
namespace DesignPatterns\Creational\AbstractFactory;
class WinCsvWriter implements CsvWriter{
public function write(array $line): string{
return join(',', $line) . "\r\n";
}
}
WinJsonWriter.php
<?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
<?php
namespace DesignPatterns\Creational\AbstractFactory;
class WinWriterFactory implements WriterFactory{
public function createCsvWriter(): CsvWriter{
return new WinCsvWriter();
}
public function createJsonWriter(): JsonWriter{
return new WinJsonWriter();
}
}
測試
Tests/AbstractFactoryTest.php
<?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());
}
}
更多建議: