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

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

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

通俗的說,以前創建一個物件要使用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
超越炒作:評估當今PHP的角色超越炒作:評估當今PHP的角色Apr 12, 2025 am 12:17 AM

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

PHP中的弱參考是什麼?什麼時候有用?PHP中的弱參考是什麼?什麼時候有用?Apr 12, 2025 am 12:13 AM

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

解釋PHP中的__ Invoke Magic方法。解釋PHP中的__ Invoke Magic方法。Apr 12, 2025 am 12:07 AM

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。

解釋PHP 8.1中的纖維以進行並發。解釋PHP 8.1中的纖維以進行並發。Apr 12, 2025 am 12:05 AM

Fibers在PHP8.1中引入,提升了並發處理能力。 1)Fibers是一種輕量級的並發模型,類似於協程。 2)它們允許開發者手動控制任務的執行流,適合處理I/O密集型任務。 3)使用Fibers可以編寫更高效、響應性更強的代碼。

PHP社區:資源,支持和發展PHP社區:資源,支持和發展Apr 12, 2025 am 12:04 AM

PHP社區提供了豐富的資源和支持,幫助開發者成長。 1)資源包括官方文檔、教程、博客和開源項目如Laravel和Symfony。 2)支持可以通過StackOverflow、Reddit和Slack頻道獲得。 3)開發動態可以通過關注RFC了解。 4)融入社區可以通過積極參與、貢獻代碼和學習分享來實現。

PHP與Python:了解差異PHP與Python:了解差異Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

php:死亡還是簡單地適應?php:死亡還是簡單地適應?Apr 11, 2025 am 12:13 AM

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來:改編和創新PHP的未來:改編和創新Apr 11, 2025 am 12:01 AM

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版