mirror of
https://github.com/DesignPatternsPHP/DesignPatternsPHP.git
synced 2025-07-31 20:20:15 +02:00
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:
8
Creational/AbstractFactory/CsvWriter.php
Normal file
8
Creational/AbstractFactory/CsvWriter.php
Normal file
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace DesignPatterns\Creational\AbstractFactory;
|
||||
|
||||
interface CsvWriter
|
||||
{
|
||||
public function write(array $line): string;
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
8
Creational/AbstractFactory/JsonWriter.php
Normal file
8
Creational/AbstractFactory/JsonWriter.php
Normal file
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace DesignPatterns\Creational\AbstractFactory;
|
||||
|
||||
interface JsonWriter
|
||||
{
|
||||
public function write(array $data, bool $formatted): string;
|
||||
}
|
@@ -1,8 +0,0 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace DesignPatterns\Creational\AbstractFactory;
|
||||
|
||||
interface Product
|
||||
{
|
||||
public function calculatePrice(): int;
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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:
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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());
|
||||
}
|
||||
}
|
||||
|
11
Creational/AbstractFactory/UnixCsvWriter.php
Normal file
11
Creational/AbstractFactory/UnixCsvWriter.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace DesignPatterns\Creational\AbstractFactory;
|
||||
|
||||
class UnixCsvWriter implements CsvWriter
|
||||
{
|
||||
public function write(array $line): string
|
||||
{
|
||||
return join(',', $line) . "\n";
|
||||
}
|
||||
}
|
17
Creational/AbstractFactory/UnixJsonWriter.php
Normal file
17
Creational/AbstractFactory/UnixJsonWriter.php
Normal 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);
|
||||
}
|
||||
}
|
16
Creational/AbstractFactory/UnixWriterFactory.php
Normal file
16
Creational/AbstractFactory/UnixWriterFactory.php
Normal 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();
|
||||
}
|
||||
}
|
11
Creational/AbstractFactory/WinCsvWriter.php
Normal file
11
Creational/AbstractFactory/WinCsvWriter.php
Normal 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";
|
||||
}
|
||||
}
|
13
Creational/AbstractFactory/WinJsonWriter.php
Normal file
13
Creational/AbstractFactory/WinJsonWriter.php
Normal 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);
|
||||
}
|
||||
}
|
16
Creational/AbstractFactory/WinWriterFactory.php
Normal file
16
Creational/AbstractFactory/WinWriterFactory.php
Normal 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();
|
||||
}
|
||||
}
|
9
Creational/AbstractFactory/WriterFactory.php
Normal file
9
Creational/AbstractFactory/WriterFactory.php
Normal 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 |
Reference in New Issue
Block a user