Skip to content

Commit e3fd663

Browse files
author
Dominik Liebler
authored
Abstract factory (DesignPatternsPHP#366)
* rewrite of the Abstract Factory pattern * update composer deps * fixed argument to json_encode which cannot be null
1 parent 5fb2980 commit e3fd663

16 files changed

+165
-111
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace DesignPatterns\Creational\AbstractFactory;
4+
5+
interface CsvWriter
6+
{
7+
public function write(array $line): string;
8+
}

Creational/AbstractFactory/DigitalProduct.php

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace DesignPatterns\Creational\AbstractFactory;
4+
5+
interface JsonWriter
6+
{
7+
public function write(array $data, bool $formatted): string;
8+
}

Creational/AbstractFactory/Product.php

Lines changed: 0 additions & 8 deletions
This file was deleted.

Creational/AbstractFactory/ProductFactory.php

Lines changed: 0 additions & 18 deletions
This file was deleted.

Creational/AbstractFactory/README.rst

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,57 @@ Code
2121

2222
You can also find this code on `GitHub`_
2323

24-
Product.php
24+
WriterFactory.php
2525

26-
.. literalinclude:: Product.php
26+
.. literalinclude:: WriterFactory.php
2727
:language: php
2828
:linenos:
2929

30-
ShippableProduct.php
30+
CsvWriter.php
3131

32-
.. literalinclude:: ShippableProduct.php
32+
.. literalinclude:: CsvWriter.php
3333
:language: php
3434
:linenos:
3535

36-
DigitalProduct.php
36+
JsonWriter.php
3737

38-
.. literalinclude:: DigitalProduct.php
38+
.. literalinclude:: JsonWriter.php
3939
:language: php
4040
:linenos:
4141

42-
ProductFactory.php
42+
UnixCsvWriter.php
4343

44-
.. literalinclude:: ProductFactory.php
44+
.. literalinclude:: UnixCsvWriter.php
45+
:language: php
46+
:linenos:
47+
48+
UnixJsonWriter.php
49+
50+
.. literalinclude:: UnixJsonWriter.php
51+
:language: php
52+
:linenos:
53+
54+
UnixWriterFactory.php
55+
56+
.. literalinclude:: UnixWriterFactory.php
57+
:language: php
58+
:linenos:
59+
60+
WinCsvWriter.php
61+
62+
.. literalinclude:: WinCsvWriter.php
63+
:language: php
64+
:linenos:
65+
66+
WinJsonWriter.php
67+
68+
.. literalinclude:: WinJsonWriter.php
69+
:language: php
70+
:linenos:
71+
72+
WinWriterFactory.php
73+
74+
.. literalinclude:: WinWriterFactory.php
4575
:language: php
4676
:linenos:
4777

Creational/AbstractFactory/ShippableProduct.php

Lines changed: 0 additions & 27 deletions
This file was deleted.

Creational/AbstractFactory/Tests/AbstractFactoryTest.php

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,31 @@
22

33
namespace DesignPatterns\Creational\AbstractFactory\Tests;
44

5-
use DesignPatterns\Creational\AbstractFactory\DigitalProduct;
6-
use DesignPatterns\Creational\AbstractFactory\ProductFactory;
7-
use DesignPatterns\Creational\AbstractFactory\ShippableProduct;
5+
use DesignPatterns\Creational\AbstractFactory\CsvWriter;
6+
use DesignPatterns\Creational\AbstractFactory\JsonWriter;
7+
use DesignPatterns\Creational\AbstractFactory\UnixWriterFactory;
8+
use DesignPatterns\Creational\AbstractFactory\WinWriterFactory;
9+
use DesignPatterns\Creational\AbstractFactory\WriterFactory;
810
use PHPUnit\Framework\TestCase;
911

1012
class AbstractFactoryTest extends TestCase
1113
{
12-
public function testCanCreateDigitalProduct()
14+
public function provideFactory()
1315
{
14-
$factory = new ProductFactory();
15-
$product = $factory->createDigitalProduct(150);
16-
17-
$this->assertInstanceOf(DigitalProduct::class, $product);
18-
}
19-
20-
public function testCanCreateShippableProduct()
21-
{
22-
$factory = new ProductFactory();
23-
$product = $factory->createShippableProduct(150);
24-
25-
$this->assertInstanceOf(ShippableProduct::class, $product);
16+
return [
17+
[new UnixWriterFactory()],
18+
[new WinWriterFactory()]
19+
];
2620
}
2721

28-
public function testCanCalculatePriceForDigitalProduct()
22+
/**
23+
* @dataProvider provideFactory
24+
*
25+
* @param WriterFactory $writerFactory
26+
*/
27+
public function testCanCreateCsvWriterOnUnix(WriterFactory $writerFactory)
2928
{
30-
$factory = new ProductFactory();
31-
$product = $factory->createDigitalProduct(150);
32-
33-
$this->assertEquals(150, $product->calculatePrice());
34-
}
35-
36-
public function testCanCalculatePriceForShippableProduct()
37-
{
38-
$factory = new ProductFactory();
39-
$product = $factory->createShippableProduct(150);
40-
41-
$this->assertEquals(200, $product->calculatePrice());
29+
$this->assertInstanceOf(JsonWriter::class, $writerFactory->createJsonWriter());
30+
$this->assertInstanceOf(CsvWriter::class, $writerFactory->createCsvWriter());
4231
}
4332
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace DesignPatterns\Creational\AbstractFactory;
4+
5+
class UnixCsvWriter implements CsvWriter
6+
{
7+
public function write(array $line): string
8+
{
9+
return join(',', $line) . "\n";
10+
}
11+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace DesignPatterns\Creational\AbstractFactory;
4+
5+
class UnixJsonWriter implements JsonWriter
6+
{
7+
public function write(array $data, bool $formatted): string
8+
{
9+
$options = 0;
10+
11+
if ($formatted) {
12+
$options = JSON_PRETTY_PRINT;
13+
}
14+
15+
return json_encode($data, $options);
16+
}
17+
}

0 commit comments

Comments
 (0)