PHP設計模式之工廠模式

2021-09-08 09:32:42 字數 1788 閱讀 9440

最初在設計模式 一書中,許多設計模式都鼓勵使用鬆散耦合。要理解這個概念,讓我們最好談一下許多開發人員從事大型系統的艱苦歷程。在更改乙個**片段時,就會發生問題,系統其他部分 —— 您曾認為完全不相關的部分中也有可能出現級聯破壞。

該問題在於緊密耦合 。系統某個部分中的函式和類嚴重依賴於系統的其他部分中函式和類的行為和結構。您需要一組模式,使這些類能夠相互通訊,但不希望將它們緊密繫結在一起,以避免出現聯鎖。

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

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

清單 1 顯示工廠類的乙個示列。等式的伺服器端包括兩個部分:資料庫和一組 php 頁面,這些頁面允許您新增反饋、請求反饋列表並獲取與特定反饋相關的文章。

<?php

inte***ce iuser

class user implements iuser

public function getname()

}class use***ctory

}$uo = use***ctory::create( 1 );

echo( $uo->getname()."\n" );

?>

複製**

iuser 介面定義使用者物件應執行什麼操作。iuser 的實現稱為 user,use***ctory 工廠類則建立 iuser 物件。此關係可以用圖 1 中的 uml 表示。

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

如果您使用 php 直譯器在命令列上執行此**,將得到如下結果:

% php factory1.php 

jack

%

測試**會向工廠請求 user 物件,並輸出 getname 方法的結果。

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

清單 2 顯示使用工廠方法的乙個示例。

<?php

inte***ce iuser

class user implements iuser

public static function create( ) 

public function __construct( $id )

public function getname()

}$uo = user::load( 1 );

echo( $uo->getname()."\n" );

?>

複製**

這段**要簡單得多。它僅有乙個介面 iuser 和乙個實現此介面的 user 類。user 類有兩個建立物件的靜態方法。此關係可用圖 2 中的 uml 表示。

圖 2. iuser 介面和帶有工廠方法的 user 類

在命令列中執行指令碼產生的結果與清單 1 的結果相同,如下所示:

% php factory2.php 

jack

%

如上所述,有時此類模式在規模較小的環境中似乎有些大材小用。不過,最好還是學習這種紮實的編碼形式,以便應用於任意規模的專案中。

php設計模式之工廠模式

一直都對php的設計模式有著一種特殊的 情結 從最開始接觸到的單例模式,到經典的mvc設計模式,每次的接觸都讓我為之驚奇。買了本php設計模式在家看,發現,都是專有名詞,再加上太專業的術語,讓我沒有看下去的勇氣。無意之中逛論壇,發現乙個部落格,關於php的五種設計模式,其中就有工廠模式。看完後,第一...

php設計模式之工廠模式

工廠模式的最大優點在於建立物件上面,就是把建立物件的過程封裝起來,這樣隨時可以產生乙個新的物件。減少 進行複製粘帖,耦合關係重,牽一發動其他部分 通俗的說,以前建立乙個物件要使用new 現在把這個過程封裝起來了。假設不使用工廠模式 那麼很多地方呼叫類a 就會這樣子建立乙個例項 new a 假設某天需...

php模式設計之 工廠模式

那麼何為工廠模式?從名字來看,似乎看不出什麼端倪。工廠模式,和生產有關?還是和生產流程 子了,所謂工廠模式還真和生產有關。生產什麼呢?生產出來的是乙個例項物件。通過什麼裝置生產?通過乙個工廠類生產。怎麼生產呢?工廠類呼叫自身靜態方法 來生產物件例項。工廠模式有乙個關鍵的構造,根據一般原則命名為fac...