PHP Design Patterns Factory Method
About the Factory Method
In the Factory Method Pattern, a factory method defines what functions must be available in the non-abstract or concrete factory. These functions must be able to create objects that are extensions of a specific class. Which exact subclass is created will depend on the value of a parameter passed to the function.
In this example we have a factory method, AbstractFactoryMethod, that specifies the function, makePHPBook($param).
The concrete class OReillyFactoryMethod factory extends AbstractFactoryMethod, and can create the correct the extension of the AbstractPHPBook class for a given value of $param.
AbstractFactoryMethod.php
//copyright Lawrence Truett and FluffyCat.com 2007, all rights reserved
abstract class AbstractFactoryMethod { abstract function makePHPBook($param); }
download source, use right-click and "Save Target As..." to save with a .php extension.
OReillyFactoryMethod.php
//copyright Lawrence Truett and FluffyCat.com 2005, all rights reserved
include_once('AbstractFactoryMethod.php'); include_once('OReillyPHPBook.php'); include_once('SamsPHPBook.php'); class OReillyFactoryMethod extends AbstractFactoryMethod { private $context = "OReilly"; function makePHPBook($param) { $book = NULL; switch ($param) { case "us": $book = new OReillyPHPBook; break; case "other": $book = new SamsPHPBook; break; default: $book = new OReillyPHPBook; break; } return $book; } }
download source, use right-click and "Save Target As..." to save with a .php extension.
SamsFactoryMethod.php
//copyright Lawrence Truett and FluffyCat.com 2005, all rights reserved
include_once('AbstractFactoryMethod.php'); include_once('OReillyPHPBook.php'); include_once('SamsPHPBook.php'); include_once('VisualQuickstartPHPBook.php'); class SamsFactoryMethod extends AbstractFactoryMethod { private $context = "Sams"; function makePHPBook($param) { $book = NULL; switch ($param) { case "us": $book = new SamsPHPBook; break; case "other": $book = new OReillyPHPBook; break; case "otherother": $book = new VisualQuickstartPHPBook; break; default: $book = new SamsPHPBook; break; } return $book; } }
download source, use right-click and "Save Target As..." to save with a .php extension.
AbstractBook.php
//copyright Lawrence Truett and FluffyCat.com 2007, all rights reserved
abstract class AbstractBook {
abstract function getAuthor();
abstract function getTitle();
}
download source, use right-click and "Save Target As..." to save with a .php extension.
AbstractPHPBook.php
//copyright Lawrence Truett and FluffyCat.com 2007, all rights reserved
include_once('AbstractBook.php');
abstract class AbstractPHPBook {
private $subject = "PHP";
}
download source, use right-click and "Save Target As..." to save with a .php extension.
OReillyPHPBook.php
//copyright Lawrence Truett and FluffyCat.com 2007, all rights reserved
include_once('AbstractPHPBook.php'); class OReillyPHPBook extends AbstractPHPBook { private $author; private $title; private static $oddOrEven = 'odd'; function __construct() { //alternate between 2 books if ('odd' == self::$oddOrEven) { $this->author = 'Rasmus Lerdorf and Kevin Tatroe'; $this->title = 'Programming PHP'; self::$oddOrEven = 'even'; } else { $this->author = 'David Sklar and Adam Trachtenberg'; $this->title = 'PHP Cookbook'; self::$oddOrEven = 'odd'; } } function getAuthor() {return $this->author;} function getTitle() {return $this->title;} }
download source, use right-click and "Save Target As..." to save with a .php extension.
SamsPHPBook.php
//copyright Lawrence Truett and FluffyCat.com 2007, all rights reserved
include_once('AbstractPHPBook.php'); class SamsPHPBook extends AbstractPHPBook { private $author; private $title; function __construct() { //alternate randomly between 2 books mt_srand((double)microtime()*10000000); $rand_num = mt_rand(0,1); if (1 > $rand_num) { $this->author = 'George Schlossnagle'; $this->title = 'Advanced PHP Programming'; } else { $this->author = 'Christian Wenz'; $this->title = 'PHP Phrasebook'; } } function getAuthor() {return $this->author;} function getTitle() {return $this->title;} }
download source, use right-click and "Save Target As..." to save with a .php extension.
VisualQuickstartPHPBook.php
//copyright Lawrence Truett and FluffyCat.com 2007, all rights reserved
include_once('AbstractPHPBook.php'); class VisualQuickstartPHPBook extends AbstractPHPBook { private $author; private $title; function __construct() { $this->author = 'Larry Ullman'; $this->title = 'PHP for the World Wide Web'; } function getAuthor() {return $this->author;} function getTitle() {return $this->title;} }
download source, use right-click and "Save Target As..." to save with a .php extension.
Try the Design Patterns Video Tutorial from SourceMaking
testFactoryMethod.php
//copyright Lawrence Truett and FluffyCat.com 2005, all rights reserved
include_once('OReillyFactoryMethod.php'); include_once('SamsFactoryMethod.php');
echo tagins("html"); echo tagins("head"); echo tagins("/head"); echo tagins("body");
echo "BEGIN TESTING FACTORY METHOD PATTERN"; echo tagins("br").tagins("br"); echo 'testing OReillyFactoryMethod'.tagins("br"); $factoryMethodInstance = new OReillyFactoryMethod; testFactoryMethod($factoryMethodInstance); echo tagins("br"); echo 'testing SamsFactoryMethod'.tagins("br"); $factoryMethodInstance = new SamsFactoryMethod; testFactoryMethod($factoryMethodInstance); echo tagins("br"); echo "END TESTING FACTORY METHOD PATTERN"; echo tagins("br"); echo tagins("/body"); echo tagins("/html");
function testFactoryMethod($factoryMethodInstance) {
$phpUs = $factoryMethodInstance->makePHPBook("us"); echo 'us php Author: '. $phpUs->getAuthor().tagins("br"); echo 'us php Title: '. $phpUs->getTitle().tagins("br");
$phpUs = $factoryMethodInstance->makePHPBook("other"); echo 'other php Author: '. $phpUs->getAuthor().tagins("br"); echo 'other php Title: '. $phpUs->getTitle().tagins("br"); $phpUs = $factoryMethodInstance->makePHPBook("otherother"); echo 'otherother php Author: '. $phpUs->getAuthor().tagins("br"); echo 'otherother php Title: '. $phpUs->getTitle().tagins("br"); } //doing this so code can be displayed without breaks function tagins($stuffing) { return "<".$stuffing.">"; }
download source, use right-click and "Save Target As..." to save with a .php extension.
output of testAbstractFactory.php
BEGIN TESTING FACTORY METHOD PATTERN
testing OReillyFactoryMethod us php Author: Rasmus Lerdorf and Kevin Tatroe us php Title: Programming PHP other php Author: George Schlossnagle other php Title: Advanced PHP Programming otherother php Author: David Sklar and Adam Trachtenberg otherother php Title: PHP Cookbook
testing SamsFactoryMethod us php Author: Christian Wenz us php Title: PHP Phrasebook other php Author: Rasmus Lerdorf and Kevin Tatroe other php Title: Programming PHP otherother php Author: Larry Ullman otherother php Title: PHP for the World Wide Web
END TESTING FACTORY METHOD PATTERN
References
| Comments Comments are left by visitors to FluffyCat.com, are not endorsed by FluffyCat.com, and may or may not be accurate. |
| Comment by Larry on 2006-11-03 Rate this Comment |
This example shows one type of factory method, in which a concrete factory can make several variations of one or more related objects. Which variation is created is determined by a parameter passed to the concrete factory.
|
| Sign In |
| to add your own comment |