Abstract factory (#366)

* rewrite of the Abstract Factory pattern

* update composer deps

* fixed argument to json_encode which cannot be null
This commit is contained in:
Dominik Liebler
2019-09-03 18:40:18 +02:00
committed by GitHub
parent 5fb2980b45
commit e3fd6631b5
16 changed files with 165 additions and 111 deletions

View File

@@ -0,0 +1,8 @@
<?php
namespace DesignPatterns\Creational\AbstractFactory;
interface CsvWriter
{
public function write(array $line): string;
}

View File

@@ -1,21 +0,0 @@
<?php declare(strict_types=1);
namespace DesignPatterns\Creational\AbstractFactory;
class DigitalProduct implements Product
{
/**
* @var int
*/
private $price;
public function __construct(int $price)
{
$this->price = $price;
}
public function calculatePrice(): int
{
return $this->price;
}
}

View File

@@ -0,0 +1,8 @@
<?php
namespace DesignPatterns\Creational\AbstractFactory;
interface JsonWriter
{
public function write(array $data, bool $formatted): string;
}

View File

@@ -1,8 +0,0 @@
<?php declare(strict_types=1);
namespace DesignPatterns\Creational\AbstractFactory;
interface Product
{
public function calculatePrice(): int;
}

View File

@@ -1,18 +0,0 @@
<?php declare(strict_types=1);
namespace DesignPatterns\Creational\AbstractFactory;
class ProductFactory
{
const SHIPPING_COSTS = 50;
public function createShippableProduct(int $price): Product
{
return new ShippableProduct($price, self::SHIPPING_COSTS);
}
public function createDigitalProduct(int $price): Product
{
return new DigitalProduct($price);
}
}

View File

@@ -21,27 +21,57 @@ Code
You can also find this code on `GitHub`_
Product.php
WriterFactory.php
.. literalinclude:: Product.php
.. literalinclude:: WriterFactory.php
:language: php
:linenos:
ShippableProduct.php
CsvWriter.php
.. literalinclude:: ShippableProduct.php
.. literalinclude:: CsvWriter.php
:language: php
:linenos:
DigitalProduct.php
JsonWriter.php
.. literalinclude:: DigitalProduct.php
.. literalinclude:: JsonWriter.php
:language: php
:linenos:
ProductFactory.php
UnixCsvWriter.php
.. literalinclude:: ProductFactory.php
.. literalinclude:: UnixCsvWriter.php
:language: php
:linenos:
UnixJsonWriter.php
.. literalinclude:: UnixJsonWriter.php
:language: php
:linenos:
UnixWriterFactory.php
.. literalinclude:: UnixWriterFactory.php
:language: php
:linenos:
WinCsvWriter.php
.. literalinclude:: WinCsvWriter.php
:language: php
:linenos:
WinJsonWriter.php
.. literalinclude:: WinJsonWriter.php
:language: php
:linenos:
WinWriterFactory.php
.. literalinclude:: WinWriterFactory.php
:language: php
:linenos:

View File

@@ -1,27 +0,0 @@
<?php declare(strict_types=1);
namespace DesignPatterns\Creational\AbstractFactory;
class ShippableProduct implements Product
{
/**
* @var int
*/
private $productPrice;
/**
* @var int
*/
private $shippingCosts;
public function __construct(int $productPrice, int $shippingCosts)
{
$this->productPrice = $productPrice;
$this->shippingCosts = $shippingCosts;
}
public function calculatePrice(): int
{
return $this->productPrice + $this->shippingCosts;
}
}

View File

@@ -2,42 +2,31 @@
namespace DesignPatterns\Creational\AbstractFactory\Tests;
use DesignPatterns\Creational\AbstractFactory\DigitalProduct;
use DesignPatterns\Creational\AbstractFactory\ProductFactory;
use DesignPatterns\Creational\AbstractFactory\ShippableProduct;
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 testCanCreateDigitalProduct()
public function provideFactory()
{
$factory = new ProductFactory();
$product = $factory->createDigitalProduct(150);
$this->assertInstanceOf(DigitalProduct::class, $product);
return [
[new UnixWriterFactory()],
[new WinWriterFactory()]
];
}
public function testCanCreateShippableProduct()
/**
* @dataProvider provideFactory
*
* @param WriterFactory $writerFactory
*/
public function testCanCreateCsvWriterOnUnix(WriterFactory $writerFactory)
{
$factory = new ProductFactory();
$product = $factory->createShippableProduct(150);
$this->assertInstanceOf(ShippableProduct::class, $product);
}
public function testCanCalculatePriceForDigitalProduct()
{
$factory = new ProductFactory();
$product = $factory->createDigitalProduct(150);
$this->assertEquals(150, $product->calculatePrice());
}
public function testCanCalculatePriceForShippableProduct()
{
$factory = new ProductFactory();
$product = $factory->createShippableProduct(150);
$this->assertEquals(200, $product->calculatePrice());
$this->assertInstanceOf(JsonWriter::class, $writerFactory->createJsonWriter());
$this->assertInstanceOf(CsvWriter::class, $writerFactory->createCsvWriter());
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace DesignPatterns\Creational\AbstractFactory;
class UnixCsvWriter implements CsvWriter
{
public function write(array $line): string
{
return join(',', $line) . "\n";
}
}

View File

@@ -0,0 +1,17 @@
<?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);
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace DesignPatterns\Creational\AbstractFactory;
class UnixWriterFactory implements WriterFactory
{
public function createCsvWriter(): CsvWriter
{
return new UnixCsvWriter();
}
public function createJsonWriter(): JsonWriter
{
return new UnixJsonWriter();
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace DesignPatterns\Creational\AbstractFactory;
class WinCsvWriter implements CsvWriter
{
public function write(array $line): string
{
return join(',', $line) . "\r\n";
}
}

View File

@@ -0,0 +1,13 @@
<?php
namespace DesignPatterns\Creational\AbstractFactory;
class WinJsonWriter implements JsonWriter
{
public function write(array $data, bool $formatted): string
{
return json_encode($data, JSON_PRETTY_PRINT);
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace DesignPatterns\Creational\AbstractFactory;
class WinWriterFactory implements WriterFactory
{
public function createCsvWriter(): CsvWriter
{
return new WinCsvWriter();
}
public function createJsonWriter(): JsonWriter
{
return new UnixJsonWriter();
}
}

View File

@@ -0,0 +1,9 @@
<?php
namespace DesignPatterns\Creational\AbstractFactory;
interface WriterFactory
{
public function createCsvWriter(): CsvWriter;
public function createJsonWriter(): JsonWriter;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 66 KiB