在大型系統中,許多代碼依賴於少數幾個關鍵類。需要更改這些類時,可能會出現困難。例如,假設您有一個從檔案讀取的 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 |