Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,9 @@
test:
@echo "Design Pattern Tests"
php ./vendor/bin/phpunit --bootstrap ./vendor/autoload.php ./tests/ --testdox --colors

.PHONY: test-class
test-class:
@echo "Design Pattern Tests for test class name"
php ./vendor/bin/phpunit --bootstrap ./vendor/autoload.php ./tests/ --testdox --colors --filter $(filter-out $@,$(MAKECMDGOALS))

16 changes: 16 additions & 0 deletions src/Creational/FactoryMethod/Factory/AcousticGuitarFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

namespace Growthdev\DesignPatterns\Creational\FactoryMethod\Factory;

use Growthdev\DesignPatterns\Creational\FactoryMethod\Product\AcousticGuitar;
use Growthdev\DesignPatterns\Creational\FactoryMethod\Product\MusicalInstrument;

class AcousticGuitarFactory implements MusicalInstrumentFactory
{
public function createMusicalInstrument(string $brand): MusicalInstrument
{
return new AcousticGuitar($brand);
}
}
16 changes: 16 additions & 0 deletions src/Creational/FactoryMethod/Factory/ElectricGuitarFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

namespace Growthdev\DesignPatterns\Creational\FactoryMethod\Factory;

use Growthdev\DesignPatterns\Creational\FactoryMethod\Product\ElectricGuitar;
use Growthdev\DesignPatterns\Creational\FactoryMethod\Product\MusicalInstrument;

class ElectricGuitarFactory implements MusicalInstrumentFactory
{
public function createMusicalInstrument(string $brand): MusicalInstrument
{
return new ElectricGuitar($brand);
}
}
12 changes: 12 additions & 0 deletions src/Creational/FactoryMethod/Factory/MusicalInstrumentFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace Growthdev\DesignPatterns\Creational\FactoryMethod\Factory;

use Growthdev\DesignPatterns\Creational\FactoryMethod\Product\MusicalInstrument;

interface MusicalInstrumentFactory
{
public function createMusicalInstrument(string $brand): MusicalInstrument;
}
27 changes: 27 additions & 0 deletions src/Creational/FactoryMethod/MusicalInstrumentFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace Growthdev\DesignPatterns\Creational\FactoryMethod;

use Growthdev\DesignPatterns\Creational\FactoryMethod\Factory\AcousticGuitarFactory;
use Growthdev\DesignPatterns\Creational\FactoryMethod\Factory\ElectricGuitarFactory;
use Growthdev\DesignPatterns\Creational\FactoryMethod\Product\MusicalInstrument;

class MusicalInstrumentFactory
{
public const ACOUSTIC_GUITAR = 'acoustic_guitar';
public const ELECTRIC_GUITAR = 'electric_guitar';

public function createMusicalInstrument(string $type, string $brand): MusicalInstrument
{
switch ($type) {
case self::ACOUSTIC_GUITAR:
return (new AcousticGuitarFactory())->createMusicalInstrument($brand);
case self::ELECTRIC_GUITAR:
return (new ElectricGuitarFactory())->createMusicalInstrument($brand);
default:
throw new \InvalidArgumentException('Invalid musical instrument type');
}
}
}
13 changes: 13 additions & 0 deletions src/Creational/FactoryMethod/Product/AcousticGuitar.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

declare(strict_types=1);

namespace Growthdev\DesignPatterns\Creational\FactoryMethod\Product;

class AcousticGuitar extends MusicalInstrument
{
public function make(): void
{
printf("Made a %s acoustic guitar \n\n", $this->getBrand());
}
}
13 changes: 13 additions & 0 deletions src/Creational/FactoryMethod/Product/ElectricGuitar.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

declare(strict_types=1);

namespace Growthdev\DesignPatterns\Creational\FactoryMethod\Product;

class ElectricGuitar extends MusicalInstrument
{
public function make(): void
{
printf("Made a %s eletric guitar \n\n", $this->getBrand());
}
}
20 changes: 20 additions & 0 deletions src/Creational/FactoryMethod/Product/MusicalInstrument.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

declare(strict_types=1);

namespace Growthdev\DesignPatterns\Creational\FactoryMethod\Product;

abstract class MusicalInstrument implements MusicalInstrumentProduct
{
private string $brand;

public function __construct(string $brand)
{
$this->brand = $brand;
}

protected function getBrand(): string
{
return $this->brand;
}
}
10 changes: 10 additions & 0 deletions src/Creational/FactoryMethod/Product/MusicalInstrumentProduct.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

declare(strict_types=1);

namespace Growthdev\DesignPatterns\Creational\FactoryMethod\Product;

interface MusicalInstrumentProduct
{
public function make(): void;
}
47 changes: 47 additions & 0 deletions tests/Creational/FactoryMethod/MusicalInstrumentFactoryTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

declare(strict_types=1);

namespace DesignPatterns\Creational\FactoryMethod;

use Growthdev\DesignPatterns\Creational\FactoryMethod\MusicalInstrumentFactory;
use Growthdev\DesignPatterns\Creational\FactoryMethod\Product\AcousticGuitar;
use Growthdev\DesignPatterns\Creational\FactoryMethod\Product\ElectricGuitar;
use PHPUnit\Framework\TestCase;

final class MusicalInstrumentFactoryTest extends TestCase
{
public function testCanCreateAcousticGuitar(): void
{
$factory = new MusicalInstrumentFactory();
$acousticGuitar = $factory->createMusicalInstrument(
MusicalInstrumentFactory::ACOUSTIC_GUITAR,
'Giannini Model'
);

$acousticGuitar->make();

$this->assertInstanceOf(AcousticGuitar::class, $acousticGuitar);
}

public function testCanCreateEletricGuitar(): void
{
$factory = new MusicalInstrumentFactory();
$eletricGuitar = $factory->createMusicalInstrument(
MusicalInstrumentFactory::ELECTRIC_GUITAR,
'Tagima Model'
);

$eletricGuitar->make();

$this->assertInstanceOf(ElectricGuitar::class, $eletricGuitar);
}

public function testShouldThrowExceptionWhenUnknownInstrument(): void
{
$this->expectException(\InvalidArgumentException::class);

$factory = new MusicalInstrumentFactory();
$factory->createMusicalInstrument('Unknown', 'Giannini Model');
}
}