I'm studying design patterns and I made this car store implementation. Although I'm confident that the idea is right, I'm not confident that the implementation is good. I would like you to check it out and give me some advice.
It doesn't have tests, and I'm using an abstract class with a private method.
Car
:
<?php namespace Pattern\AbstractFactory;
interface Car {
}
CarFactory
:
<?php namespace Pattern\AbstractFactory;
use InvalidArgumentException;
abstract class CarFactory {
private $sports = [];
private $family = [];
function __construct(array $sports, array $family)
{
$this->sports = $sports;
$this->family = $family;
}
public function makeSportsCar($name)
{
return $this->makeCar($this->sports, $name);
}
public function makeFamilyCar($name)
{
return $this->makeCar($this->family, $name);
}
private function makeCar(array $cars, $name)
{
if (! isset($cars[$name]))
{
throw new InvalidArgumentException('You tried to make a nonexistent car');
}
return new $cars[$name];
}
}
CarStore
:
<?php namespace Pattern\AbstractFactory;
class CarStore {
private $factory;
function __construct(CarFactory $factory)
{
$this->factory = $factory;
}
public function orderSportsCar($name)
{
return $this->factory->makeSportsCar($name);
}
public function orderFamilyCar($name)
{
return $this->factory->makeFamilyCar($name);
}
}
Chevrolet
:
<?php namespace Pattern\AbstractFactory\Factory;
use Pattern\AbstractFactory\CarFactory;
/**
* @codeCoverageIgnore
*/
class Chevrolet extends CarFactory {
private $sports = [
'miray' => 'Pattern\AbstractFactory\Car\Sport\Miray'
];
private $family = [
'equinox' => 'Pattern\AbstractFactory\Car\Family\Equinox'
];
function __construct()
{
parent::__construct($this->sports, $this->family);
}
}
Equinox
:
<?php namespace Pattern\AbstractFactory\Car\Family;
use Pattern\AbstractFactory\Car\Family;
class Equinox implements Family {
}
Evos
:
<?php namespace Pattern\AbstractFactory\Car\Sport;
use Pattern\AbstractFactory\Car\Sport;
class Evos implements Sport {
}
Family
:
<?php namespace Pattern\AbstractFactory\Car;
use Pattern\AbstractFactory\Car;
interface Family extends Car {
}
Ford
:
<?php namespace Pattern\AbstractFactory\Factory;
use Pattern\AbstractFactory\CarFactory;
/**
* @codeCoverageIgnore
*/
class Ford extends CarFactory {
private $sports = [
'evos' => 'Pattern\AbstractFactory\Car\Sport\Evos'
];
private $family = [
'galaxy' => 'Pattern\AbstractFactory\Car\Family\Galaxy'
];
function __construct()
{
parent::__construct($this->sports, $this->family);
}
}
Galaxy
:
<?php namespace Pattern\AbstractFactory\Car\Family;
use Pattern\AbstractFactory\Car\Family;
class Galaxy implements Family {
}
Miray
:
<?php namespace Pattern\AbstractFactory\Car\Sport;
use Pattern\AbstractFactory\Car\Sport;
class Miray implements Sport {
}
Sport
:
<?php namespace Pattern\AbstractFactory\Car;
use Pattern\AbstractFactory\Car;
interface Sport extends Car {
}