mirror of
https://github.com/DesignPatternsPHP/DesignPatternsPHP.git
synced 2025-08-03 13:37:27 +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`_
|
You can also find this code on `GitHub`_
|
||||||
|
|
||||||
Product.php
|
WriterFactory.php
|
||||||
|
|
||||||
.. literalinclude:: Product.php
|
.. literalinclude:: WriterFactory.php
|
||||||
:language: php
|
:language: php
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
ShippableProduct.php
|
CsvWriter.php
|
||||||
|
|
||||||
.. literalinclude:: ShippableProduct.php
|
.. literalinclude:: CsvWriter.php
|
||||||
:language: php
|
:language: php
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
DigitalProduct.php
|
JsonWriter.php
|
||||||
|
|
||||||
.. literalinclude:: DigitalProduct.php
|
.. literalinclude:: JsonWriter.php
|
||||||
:language: php
|
:language: php
|
||||||
:linenos:
|
: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
|
:language: php
|
||||||
:linenos:
|
: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;
|
namespace DesignPatterns\Creational\AbstractFactory\Tests;
|
||||||
|
|
||||||
use DesignPatterns\Creational\AbstractFactory\DigitalProduct;
|
use DesignPatterns\Creational\AbstractFactory\CsvWriter;
|
||||||
use DesignPatterns\Creational\AbstractFactory\ProductFactory;
|
use DesignPatterns\Creational\AbstractFactory\JsonWriter;
|
||||||
use DesignPatterns\Creational\AbstractFactory\ShippableProduct;
|
use DesignPatterns\Creational\AbstractFactory\UnixWriterFactory;
|
||||||
|
use DesignPatterns\Creational\AbstractFactory\WinWriterFactory;
|
||||||
|
use DesignPatterns\Creational\AbstractFactory\WriterFactory;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
class AbstractFactoryTest extends TestCase
|
class AbstractFactoryTest extends TestCase
|
||||||
{
|
{
|
||||||
public function testCanCreateDigitalProduct()
|
public function provideFactory()
|
||||||
{
|
{
|
||||||
$factory = new ProductFactory();
|
return [
|
||||||
$product = $factory->createDigitalProduct(150);
|
[new UnixWriterFactory()],
|
||||||
|
[new WinWriterFactory()]
|
||||||
$this->assertInstanceOf(DigitalProduct::class, $product);
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCanCreateShippableProduct()
|
/**
|
||||||
|
* @dataProvider provideFactory
|
||||||
|
*
|
||||||
|
* @param WriterFactory $writerFactory
|
||||||
|
*/
|
||||||
|
public function testCanCreateCsvWriterOnUnix(WriterFactory $writerFactory)
|
||||||
{
|
{
|
||||||
$factory = new ProductFactory();
|
$this->assertInstanceOf(JsonWriter::class, $writerFactory->createJsonWriter());
|
||||||
$product = $factory->createShippableProduct(150);
|
$this->assertInstanceOf(CsvWriter::class, $writerFactory->createCsvWriter());
|
||||||
|
|
||||||
$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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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