a builder

This commit is contained in:
Trismegiste
2013-05-12 12:30:42 +02:00
parent 64dc35c9f5
commit 4f46d28e29
10 changed files with 230 additions and 0 deletions

43
Builder/BikeBuilder.php Normal file
View File

@@ -0,0 +1,43 @@
<?php
/*
* DesignPatternPHP
*/
namespace DesignPatterns\Builder;
/**
* BikeBuilder builds bike
*/
class BikeBuilder implements Builder
{
protected $bike;
public function addDoors()
{
}
public function addEngine()
{
$this->bike->setPart('engine', new Parts\Engine());
}
public function addWheel()
{
$this->bike->setPart('forwardWheel', new Parts\Wheel());
$this->bike->setPart('rearWheel', new Parts\Wheel());
}
public function createVehicle()
{
$this->bike = new Parts\Bike();
}
public function getVehicle()
{
return $this->bike;
}
}

33
Builder/Builder.php Normal file
View File

@@ -0,0 +1,33 @@
<?php
/*
* DesignPatternPHP
*/
namespace DesignPatterns\Builder;
/**
* Builder is an interface that build parts of a complex object.
*
* Sometime, if the builder has a better knowledge of what it builds, this
* interface could be an abstract class with default methods (aka adapter)
*
* If you have a complex inheritance tree for vehicles, it is logical to have
* a complex inheritance tree for builders too.
*
* Note: Builders have often a fluent interface, see the mock builder of
* PHPUnit for example.
*/
interface Builder
{
function createVehicle();
function addWheel();
function addEngine();
function addDoors();
function getVehicle();
}

46
Builder/CarBuilder.php Normal file
View File

@@ -0,0 +1,46 @@
<?php
/*
* DesignPatternPHP
*/
namespace DesignPatterns\Builder;
/**
* CarBuilder builds car
*/
class CarBuilder implements Builder
{
protected $car;
public function addDoors()
{
$this->car->setPart('rightdoor', new Parts\Door());
$this->car->setPart('leftDoor', new Parts\Door());
}
public function addEngine()
{
$this->car->setPart('engine', new Parts\Engine());
}
public function addWheel()
{
$this->car->setPart('wheelLF', new Parts\Wheel());
$this->car->setPart('wheelRF', new Parts\Wheel());
$this->car->setPart('wheelLR', new Parts\Wheel());
$this->car->setPart('wheelRR', new Parts\Wheel());
}
public function createVehicle()
{
$this->car = new Parts\Car();
}
public function getVehicle()
{
return $this->car;
}
}

32
Builder/Director.php Normal file
View File

@@ -0,0 +1,32 @@
<?php
/*
* DesignPatternPHP
*/
namespace DesignPatterns\Builder;
/**
* Director is part of the builder pattern. It knows the interface of the builder
* and build a complex object with the help of the builder.
* If you make it abstract, this becomes a "meta-factory-method" very powerfull.
*
* You can also inject many builders instead of one to build more complex objects
*/
class Director
{
/**
* The director don't know 'bout concrete part
*/
public function build(Builder $builder)
{
$builder->createVehicle();
$builder->addDoors();
$builder->addEngine();
$builder->addWheel();
return $builder->getVehicle();
}
}

15
Builder/Parts/Bike.php Normal file
View File

@@ -0,0 +1,15 @@
<?php
/*
* DesignPatternPHP
*/
namespace DesignPatterns\Builder\Parts;
/**
* Bike is a bike
*/
class Bike extends Vehicle
{
}

15
Builder/Parts/Car.php Normal file
View File

@@ -0,0 +1,15 @@
<?php
/*
* DesignPatternPHP
*/
namespace DesignPatterns\Builder\Parts;
/**
* Car is a car
*/
class Car extends Vehicle
{
}

8
Builder/Parts/Door.php Normal file
View File

@@ -0,0 +1,8 @@
<?php
namespace DesignPatterns\Builder\Parts;
class Door
{
}

8
Builder/Parts/Engine.php Normal file
View File

@@ -0,0 +1,8 @@
<?php
namespace DesignPatterns\Builder\Parts;
class Engine
{
}

22
Builder/Parts/Vehicle.php Normal file
View File

@@ -0,0 +1,22 @@
<?php
/*
* DesignPatternPHP
*/
namespace DesignPatterns\Builder\Parts;
/**
* Vehicle is a contract for a vehicle
*/
abstract class Vehicle
{
protected $data;
public function setPart($key, $value)
{
$this->data[$key] = $value;
}
}

8
Builder/Parts/Wheel.php Normal file
View File

@@ -0,0 +1,8 @@
<?php
namespace DesignPatterns\Builder\Parts;
class Wheel
{
}