php 抽象工厂类实例,Abstract Factory in PHP 抽象工厂模式在PHP中的应用举例

In the Abstract Factory Pattern, an abstract factory defines what objects the non-abstract or concrete factory will need to be able to create.

The concrete factory must create the correct objects for it's context, insuring that all objects created by the concrete factory have been chosen to be able to work correctly for a given circumstance.

In this example we have an abstract factory, AbstractBookFactory, that specifies two classes, AbstractPHPBook and AbstractMySQLBook, which will need to be created by the concrete factory.

The concrete class OReillyBookfactory extends AbstractBookFactory, and can create the OReillyMySQLBook and OReillyPHPBook classes, which are the correct classes for the context of OReilly.

在抽象工厂模式中,抽象工厂定义了非抽象或具体的工厂类将创造什么样的对象。

具体的工厂类必须在上下文中建立正确的对象,以确保从具体的工厂类创建的所有对象中任意选定一个都能够在指定的环境下正确地运行。

在这个例子中,我们有一个抽象工厂,AbstractBookFactory,它指定两个将需要由具体工厂创建的类,AbstractPHPBook和AbstractMySQLBook。

具体工厂类OReillyBookfactory继承于AbstractBookFactory,并且可以创建两个关于 OReilly 的类OReillyMySQLBook和OReillyPHPBook的实例。

/*

* BookFactory classes

*/

abstract class AbstractBookFactory {

abstract function makePHPBook();

abstract function makeMySQLBook();

}

class OReillyBookFactory extends AbstractBookFactory {

private $context = "OReilly";

function makePHPBook() {

return new OReillyPHPBook;

}

function makeMySQLBook() {

return new OReillyMySQLBook;

}

}

class SamsBookFactory extends AbstractBookFactory {

private $context = "Sams";

function makePHPBook() {

return new SamsPHPBook;

}

function makeMySQLBook() {

return new SamsMySQLBook;

}

}

/*

* Book classes

*/

abstract class AbstractBook {

abstract function getAuthor();

abstract function getTitle();

}

abstract class AbstractMySQLBook extends AbstractBook {

private $subject = "MySQL";

}

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;

}

}

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;

}

}

abstract class AbstractPHPBook extends AbstractBook {

private $subject = "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;

}

}

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;

}

}

/*

* Initialization

*/

writeln('BEGIN TESTING ABSTRACT FACTORY PATTERN');

writeln('');

writeln('testing OReillyBookFactory');

$bookFactoryInstance = new OReillyBookFactory;

testConcreteFactory($bookFactoryInstance);

writeln('');

writeln('testing SamsBookFactory');

$bookFactoryInstance = new SamsBookFactory;

testConcreteFactory($bookFactoryInstance);

writeln("END TESTING ABSTRACT FACTORY PATTERN");

writeln('');

function testConcreteFactory($bookFactoryInstance)

{

$phpBookOne = $bookFactoryInstance->makePHPBook();

writeln('first php Author: '.$phpBookOne->getAuthor());

writeln('first php Title: '.$phpBookOne->getTitle());

$phpBookTwo = $bookFactoryInstance->makePHPBook();

writeln('second php Author: '.$phpBookTwo->getAuthor());

writeln('second php Title: '.$phpBookTwo->getTitle());

$mySqlBook = $bookFactoryInstance->makeMySQLBook();

writeln('MySQL Author: '.$mySqlBook->getAuthor());

writeln('MySQL Title: '.$mySqlBook->getTitle());

}

function writeln($line_in) {

echo $line_in."
";

}

?>

输出内容:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值