About the Abstract Factory
在抽象工厂模式,抽象工厂定义了对象的非抽象或具体的工厂将需要能够创建。
具体的工厂必须创建正确的对象,它的上下文,确保所有的具体工厂创建的对象被选中,可以正确工作对于一个给定的情况下。在这个例子中我们有一个抽象工厂,AbstractBookFactory,指定两类,AbstractPHPBook和AbstractMySQLBook,这将需要由具体的工厂。具体的类OReillyBookfactory AbstractBookFactory延伸,可以创建OReillyMySQLBook和OReillyPHPBook类,这是正确的类OReilly上下文.
Try the Design Patterns Video Tutorial from SourceMaking
AbstractBookFactory.php
//copyright Lawrence Truett and FluffyCat.com 2007, all rights reserved
abstract class AbstractBookFactory {
abstract function makePHPBook();
abstract function makeMySQLBook();
}
download source, use right-click and "Save Target As..." to save with a .php extension.
OReillyBookFactory.php
//copyright Lawrence Truett and FluffyCat.com 2007, all rights reserved
include_once('AbstractBookFactory.php');
include_once('OReillyPHPBook.php');
include_once('OReillyMySQLBook.php');
class OReillyBookFactory extends AbstractBookFactory {
private $context = "OReilly";
function makePHPBook() {return new OReillyPHPBook;}
function makeMySQLBook() {return new OReillyMySQLBook;}
}
download source, use right-click and "Save Target As..." to save with a .php extension.
SamsBookFactory.php
//copyright Lawrence Truett and FluffyCat.com 2005, all rights reserved
include_once('AbstractBookFactory.php');
include_once('SamsPHPBook.php');
include_once('SamsMySQLBook.php');
class SamsBookFactory extends AbstractBookFactory {
private $context = "Sams";
function makePHPBook() {return new SamsPHPBook;}
function makeMySQLBook() {return new SamsMySQLBook;}
}
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.
AbstractMySQLBook.php
//copyright Lawrence Truett and FluffyCat.com 2007, all rights reserved
include_once('AbstractBook.php');
abstract class AbstractMySQLBook {
private $subject = "MySQL";
}
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('AbstractMySQLBook.php');
class OReillyMySQLBook extends AbstractMySQLBook {
private $author;
private $title;
function __construct() {
$this->author = 'George Reese, Randy Jay Yarger, and Tim King';
$this->title = 'Managing and Using MySQL';
}
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.
SamsMySQLBook.php
//copyright Lawrence Truett and FluffyCat.com 2007, all rights reserved
include_once('AbstractMySQLBook.php');
class SamsMySQLBook extends AbstractMySQLBook {
private $author;
private $title;
function __construct() {
$this->author = 'Paul Dubois';
$this->title = 'MySQL, 3rd Edition';
}
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.
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.
testAbstractFactory.php
//copyright Lawrence Truett and FluffyCat.com 2005, all rights reserved
include_once('OReillyBookFactory.php');
include_once('SamsBookFactory.php');
echo tagins("html");
echo tagins("head");
echo tagins("/head");
echo tagins("body");
echo "BEGIN TESTING ABSTRACT FACTORY PATTERN";
echo tagins("br").tagins("br");
echo 'testing OReillyBookFactory'.tagins("br");
$bookFactoryInstance = new OReillyBookFactory;
testConcreteFactory($bookFactoryInstance);
echo tagins("br");
echo 'testing SamsBookFactory'.tagins("br");
$bookFactoryInstance = new SamsBookFactory;
testConcreteFactory($bookFactoryInstance);
echo tagins("br");
echo "END TESTING ABSTRACT FACTORY PATTERN";
echo tagins("br");
echo tagins("/body");
echo tagins("/html");
function testConcreteFactory($bookFactoryInstance) {
$phpBookOne = $bookFactoryInstance->makePHPBook();
echo 'first php Author: '.
$phpBookOne->getAuthor().tagins("br");
echo 'first php Title: '.
$phpBookOne->getTitle().tagins("br");
$phpBookTwo = $bookFactoryInstance->makePHPBook();
echo 'second php Author: '.
$phpBookTwo->getAuthor().tagins("br");
echo 'second php Title: '.
$phpBookTwo->getTitle().tagins("br");
$mySqlBook = $bookFactoryInstance->makeMySQLBook();
echo 'MySQL Author: '.
$mySqlBook->getAuthor().tagins("br");
echo 'MySQL Title: '.
$mySqlBook->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 ABSTRACT FACTORY PATTERN
testing OReillyBookFactory
first php Author: Rasmus Lerdorf and Kevin Tatroe
first php Title: Programming PHP
second php Author: David Sklar and Adam Trachtenberg
second php Title: PHP Cookbook
MySQL Author: George Reese, Randy Jay Yarger, and Tim King
MySQL Title: Managing and Using MySQL
testing SamsBookFactory
first php Author: Christian Wenz
first php Title: PHP Phrasebook
second php Author: George Schlossnagle
second php Title: Advanced PHP Programming
MySQL Author: Paul Dubois
MySQL Title: MySQL, 3rd Edition
END TESTING ABSTRACT FACTORY PATTERN