PHP Design Patterns .

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 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); }
To download source right-click here and "Save As...".

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; } }
To download source right-click here and "Save As...".

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; } }
To download source right-click here and "Save As...".

AbstractBook.php

//copyright Lawrence Truett and FluffyCat.com 2007, all rights reserved
  
    abstract class AbstractBook {
  
    abstract function getAuthor();
    
    abstract function getTitle();
  
  }
To download source right-click here and "Save As...".

AbstractPHPBook.php

//copyright Lawrence Truett and FluffyCat.com 2007, all rights reserved
  
    include_once('AbstractBook.php');
  
    abstract class AbstractPHPBook {
  
    private $subject = "PHP";
  
  }
To download source right-click here and "Save As...".


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;} }
To download source right-click here and "Save As...".


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;} }
To download source right-click here and "Save As...".


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;} }
To download source right-click here and "Save As...".


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.">"; }
To download source right-click here and "Save As...".


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


Design Patterns
Design Patterns by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides

PHP 5
The Official PHP web site
Core PHP Programming, 3rd Edition by Leon Atkinson and Zeev Suraski
Comments Comments are left by visitors to 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.

Another variation has the concrete factory only make one specific set of objects, and by chosing a concrete factory you choose what objects are created. I show one of these factory methods in my Java Design Patterns Factory Method.

 
Sign in to comment on PHP Design Patterns Factory Method.