首頁 後端開發 php教程 php設計模式總結-工廠模式

php設計模式總結-工廠模式

Dec 17, 2016 am 10:35 AM

使用工廠模式的目的或目標?

工廠模式的最大優點在於創建物件上面,就是把創建物件的過程封裝起來,這樣隨時可以產生一個新的物件。
減少代碼進行複製黏帖,耦合關係重,牽一發動其他部分代碼。

通俗的說,以前創建一個物件要使用new,現在把這個過程封裝起來了。
假設不使用工廠模式:那麼很多地方呼叫類別a,程式碼就會這樣子創建一個實例:new a(),假設某天需要把a類別的名稱修改,表示很多呼叫的程式碼都要修改。

工廠模式的優點就在創建物件上。
工廠模式的優點就在創建物件上。建立一個工廠(一個函數或一個類別方法)來製造新的物件,它的任務就是把物件的創建過程都封裝起來,
創建物件不是使用new的形式了。而是定義一個方法,用來建立物件實例。

每個類別可能會需要連接資料庫。那麼就將連接資料庫封裝在一個類別中。以後在其他類別中透過類別名稱:

為什麼引入抽象的概念?
想一想,在現實生活中,當我們無法確定某個具體的東西的時候,往往把一類東西歸於抽象類別。
工廠方法:
例如你的工廠叫做“香煙工廠”,那麼可以有“七匹狼工廠”“中華工廠”等,但是,這個工廠只生廠一種商品:香煙;
抽象工廠:無法描述它到底生產什麼產品,它生產很多類型的產品(所以抽象工廠就會生成子工廠)。
你的工廠是綜合型的,是生產“一系列”產品,而不是“一個”,例如:生產“香煙”,還有“啤酒”等。然後它也可以有衍生出來的具體的工廠,但這些工廠都是生產這一系列產品,只是可能因為地理不一樣,為了適應當地人口味,味道也不太一樣。
工廠模式:理解成只生成一種產品的工廠。比如生產香煙的。
工廠方法:工廠的一種產品生產線 。比如鍵盤的生成過程。

別人會反駁:吃飽了沒事幹,一定要修改類別名稱呢?這個說不定。一般都不會去修改類別名稱。

其實工廠模式有很多變體,抓住精髓才是關鍵:只要是可以根據不同的參數產生不同的類別實例,那就符合工廠模式的設計思想。

這樣子讓我聯想到框架中常常會有負責產生具體類別實例的方法供呼叫。

由於前面使用過phpcms,用phpcms的來幫助理解,更加好,如下:

pc_base:load_app_class("order"');//參數名稱就是類別名稱。將會產生得到order這個實例。傳遞不同的參數得到不同的類別實例,這就符合工廠模式。
pc_base:load_app_class("comment"');//產生一個comment類別實例

//當然load_app_class這個方法裡面還會結合了單件模式的想法。避免呼叫n次,就重複建立n個相同的實例


工廠模式我想到的一個典型的應用就是:php可能要連結mysql,也可能要連結sqlserver,還有其他什麼資料庫。那麼要做一個抽象的資料庫類,

這個類就是一個工廠類,專門負責產生不同的物件。

這樣子做很方便擴充。我們在直接連結資料庫的時候,不是使用程式碼new Mysql($host,$username,$password,$dbname)的形式

而可以動態產生一個連接資料庫的實例。可以是mysql,也可以是連接oracle的。

class DbFactory
{

function static factory($db_class_name)
{

        $db_class_name = str.lower($ 'Drivers/' . $db_class_name . '.php') {

     
$classname = 'Driver_' . $db_class_name;
            return new $db_class_name;
        
        } 


}




}



DbFactory::factory("mysql");

DbFactory::factory("oracle");


在thinkphp框架中也有對應的實作:

Db.class.php就是一個工廠類別(也可以叫做資料庫中間層,之所以叫做中間層,是因為可以操作mysql、oracle等各資料庫。 mysql、oracle等資料庫。public function factory($db_config='') {
        // 讀取資料庫設定
        $db_config = $this->parseConfig($db_config);          throw_exception(L ('_NO_DB_CONFIG_'));
        // 資料庫型別
        $this->dbType = ucwords(str約n($db_config['dbms']));        if( is_file(CORE_PATH.'Driver/Db/'.$class.'.class.php')) {
            // 內建驅動程式
    
            $path = EXTEND_PATH;
        }
        // 檢查驅動類別
        if(require_cache($path.'Driver/Db/'.$class.'.class.php            // 取得目前的資料庫類型
            if( 'pdo' != strtolower($db_config['dbms']) )
                else
                $db->dbType = $this- >_getDsnType($db_config['dsn']);
            if(APP_DEBUG)  $db->debug    = true  沒有定義
            throw_exception(L('_NOT_SUPPORT_DB_').': ' . $ 。方便未來擴展,設計成工廠模式。定一個專門生產網關介面的工廠,抽像出來,做成介面形式,讓所有的子類別都要實現它的介面。以後加一個支付方式,要用哪一種支付方式,改變一下參數即可。


書籍(英文名稱為PHP 5 Power Programming)也提到一個工廠模式的例子,學到一招:在為使用者註冊的時候,分成很多種角色的使用者。例如冊用戶,匿名用戶、管理員用戶等。完全使用可以使用工廠的思想來實現,代碼也容易維護,為每種角色可以生成操作的類別。

定義以下幾個類別:

UserFactory 用戶工廠類,負責產生不同的使用者類別
User:使用者類別的基底類,所有使用者類別都是繼承這個類別
不同角色的類別:註冊使用者類別、匿名用戶類別、管理者使用者類別







更多php設計模式總結-工廠模式相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試? 在PHPStorm中如何進行CLI模式的調試? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

如何用PHP的cURL庫發送包含JSON數據的POST請求? 如何用PHP的cURL庫發送包含JSON數據的POST請求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

See all articles