PHP設計模式之工廠模式學習筆記
來源:程序員人生 發布時間:2014-06-17 01:55:40 閱讀次數:2665次
本文章來給大家介紹php5中的一個新東西,就是工廠模式了,這里是我常用工廠模式的一些學習筆記,下面與大家一同分享有需要了解的朋友可參考.
在大型系統中,許多代碼依賴于少數幾個關鍵類.需要更改這些類時,可能會出現困難.例如,假設您有一個從文件讀取的 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 方法的結果.有一種工廠模式的變體使用工廠方法.類中的這些公共靜態方法構造該類型的對象.如果創建此類型的對象非常重要,此方法非常有用.例如,假設您需要先創建對 象,然后設置許多屬性.此版本的工廠模式會將該進程封裝在單個位置中,這樣,不用復制復雜的初始化代碼,也不必將復制好的代碼在在代碼庫中到處粘貼.
示例2 顯示使用工廠方法的一個示例.
實例代碼如下:
- <?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,將會輸出
實例代碼如下:
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈