. PHP Design Patterns . PHP Design Patterns Factory Method
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.
OReillyMySQLBook.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.
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
| Sign In |
| to add your own comment |
| Comment by Larry 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.
|