Skip to content

Instantly share code, notes, and snippets.

/Car.php Secret

Created February 8, 2015 22:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/f0c4442175c23b9fe101 to your computer and use it in GitHub Desktop.
Save anonymous/f0c4442175c23b9fe101 to your computer and use it in GitHub Desktop.
Abstract Factory
<?php namespace Pattern\AbstractFactory;
interface Car {
}
<?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];
}
}
<?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);
}
}
<?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);
}
}
<?php namespace Pattern\AbstractFactory\Car\Family;
use Pattern\AbstractFactory\Car\Family;
class Equinox implements Family {
}
<?php namespace Pattern\AbstractFactory\Car\Sport;
use Pattern\AbstractFactory\Car\Sport;
class Evos implements Sport {
}
<?php namespace Pattern\AbstractFactory\Car;
use Pattern\AbstractFactory\Car;
interface Family extends Car {
}
<?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);
}
}
<?php namespace Pattern\AbstractFactory\Car\Family;
use Pattern\AbstractFactory\Car\Family;
class Galaxy implements Family {
}
<?php namespace Pattern\AbstractFactory\Car\Sport;
use Pattern\AbstractFactory\Car\Sport;
class Miray implements Sport {
}
<?php namespace Pattern\AbstractFactory\Car;
use Pattern\AbstractFactory\Car;
interface Sport extends Car {
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment