PHP設計模式之原廠模式學習筆記

來源:互聯網
上載者:User

在大型系統中,許多代碼依賴於少數幾個關鍵類。需要更改這些類時,可能會出現困難。例如,假設您有一個從檔案讀取的 User 類。您希望將其更改為從資料庫讀取的其他類,但是,所有的代碼都引用從檔案讀取的原始類。這時候,使用原廠模式會很方便。

原廠模式是一種類,它具有為您建立對象的某些方法。您可以使用工廠類建立對象,而不直接使用 new。這樣,如果您想要更改所建立的物件類型,只需更改該工廠即可。使用該工廠的所有代碼會自動更改。

樣本1:顯示工廠類的一個示列。

等式的伺服器端包括兩個部分:資料庫和一組 PHP 頁面,這些頁面允許您添加反饋、請求反饋列表並擷取與特定反饋相關的文章

 代碼如下 複製代碼

<?php
 interface IUser
 {
  function getName();
 }
 class User implements IUser
 {
  public function __construct( $id ) { }
  public function getName()
  {
   return "Jack";
  }
 }
 class UserFactory
 {
  public static function Create( $id )
  {
   return new User( $id );
  }
 }
 $uo = UserFactory::Create( 1 );
 echo( $uo->getName()."n" );
?>

IUser介面定義使用者物件應執行什麼操作。IUser 的實現稱為 User,UserFactory 工廠類則建立 IUser 對象。此關係可以用圖1中的UML 表示。


圖 1. 工廠類及其相關 IUser 介面和使用者類

  如果您使用 php 解譯器在命令列上運行此代碼,將得到如下結果:

% php factory1.php
Jack
%
 

測試代碼會向工廠請求 User 對象,並輸出 getName 方法的結果。

  有 一種原廠模式的變體使用Factory 方法。類中的這些公用靜態方法構造該類型的對象。如果建立此類型的對象非常重要,此方法非常有用。例如,假設您需要先建立對 象,然後設定許多屬性。此版本的原廠模式會將該進程封裝在單個位置中,這樣,不用複製複雜的初始化代碼,也不必將複製好的代碼在在程式碼程式庫中到處粘貼。

樣本2 顯示使用Factory 方法的一個樣本。

 代碼如下 複製代碼

<?php
interface IUser
{
  function getName();
}
class User implements IUser
{
  public static function Load( $id )
  {
        return new User( $id );
  }
  public static function Create( )
  {
        return new User( null );
  }
  public function __construct( $id ) { }
  public function getName()
  {
    return "Jack";
  }
}
$uo = User::Load( 1 );
echo( $uo->getName()."n" );
?>


好了上面講了很多了, 下面我來來看個執行個體

我們建立以下四個檔案

index.php

 代碼如下 複製代碼

<?php
include_once("f.inc.php");
$f=new factory;
$t1=&$f->create('T1');
echo $t1->getName();
echo $config;
?>

f.inc.php

 代碼如下 複製代碼

<?php
class factory
{
 function factory()
 {
  $this->mClasses=array('T1'=>'t1.inc.php','T2'=>'t2.inc.php');
 }
 function &create($class)
 {
  if (!class_exists($class))
  {
   require_once($this->mClasses[$class]);
  }
  return new $class;
 }
}
?>

t1.inc.php

 代碼如下 複製代碼

<?php
global $config;
$config='surfchen';
class T1
{
 var $mName='name::T1';
 function getName()
 {
  return $this->mName;
 }
}
?>

t2.inc.php

 代碼如下 複製代碼

<?php
class T2
{
 function T2()
 {
  echo 't2 is ok';
 }
}
?>

在index.php裡,我們通過一個factory類來建立其他的類執行個體。
在factory裡,儲存有一個數組$this->mClasses,格式為array(“類名”=>”類檔案路徑”).
我們通過factory::create()來建立一個類執行個體的時候,在create()裡,會首先檢測類是否存在,如果不存在,就根據$this->mClasses把類對應的類檔案包含進來。然後建立並返回一個該類的執行個體。

這樣,我們只需要把factory類檔案包含進執行的指令碼(如index.php)中就可以了。

大家可能還注意到了在t1.inc.php中的這兩行代碼。

 代碼如下 複製代碼
global $config;
$config='surfchen';

為什麼需要global呢?因為t1.inc.php是在factory::create中被包含的,t1檔案中的變數將會預設為create的函數級變數。所以我們需要對其中的變數(如$config)進行global以便index.php能訪問到。

運行index.php,將會輸出

 代碼如下 複製代碼
name::T1surfchen

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.