PHP Design Patterns Abstract Factory

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

转载于:https://my.oschina.net/Qm3KQvXRq/blog/117967

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值