PHP Factory Pattern Step By Step Tutorial - Part 5: We can use power of factory pattern by create one interface for returning objects of varying classes.
<?php
class CarFactory{
function carBrand($brand){ }
}
class HondaFactory extends CarFactory{
var $context = "Honda";
function carBrand($brand){
$car = NULL;
switch($brand){
case "self":
$car = new JazzCar;
break;
case "rival":
$car = new LivinaCar;
break;
default:
$car = new JazzCar;
break;
}
return $car;
}
}
class NisanFactory extends CarFactory{
var $context = "Nisan";
function carBrand($brand){
$car = NULL;
switch($brand){
case "self":
$car = new LivinaCar;
break;
case "rival":
$car = new JazzCar;
break;
default:
$car = new LivinaCar;
break;
}
return $car;
}
}
class AbstractCar{
function getBrand(){ }
function getColor(){ }
}
class AbstractBrandCar{
var $subject = "Brand";
}
class JazzCar extends AbstractBrandCar{
var $brand = 'Jazz';
var $color = array('blue','yellow');
function getBrand(){ return $this->brand; }
function getColor(){ return $this->color; }
}
class LivinaCar extends AbstractBrandCar{
var $brand = 'Livina';
var $color = array('metalic','red');
function getBrand(){ return $this->brand; }
function getColor(){ return $this->color; }
}
$factoryInstance = new HondaFactory;
$car = $factoryInstance->carBrand('self');
echo "car name: ".$car->getBrand();
echo "</br>";
echo "available color: ".
implode(",",$car->getColor());
echo "<br>";
$factoryInstance = new NisanFactory;
$car = $factoryInstance->carBrand('rival');
echo "car name: ".$car->getBrand();
echo "</br>";
echo "available color: ".
implode(",",$car->getColor());
?>
Following image can brief us about our practice above.