PHP中的設計模式

2021-10-04 21:42:43 字數 1738 閱讀 5653

單例模式

$_instance必須宣告為靜態的私有變數

建構函式和析構函式必須宣告為私有,防止外部程式new 類從而失去單例模式的意義

getinstance()方法必須設定為公有的,必須呼叫此方法 以返回例項的乙個引用

::操作符只能訪問靜態變數和靜態函式

new物件都會消耗記憶體

使用場景:最常用的地方是資料庫連線。

使用單例模式生成乙個物件後, 該物件可以被其它眾多物件所使用。

私有的__clone()方法防止轉殖物件

單例模式,使某個類的物件僅允許建立乙個。建構函式private修飾,

申明乙個static getinstance方法,在該方法裡建立該物件的例項。如果該例項已經存在,則不建立。比如只需要建立乙個資料庫連線。

工廠模式

工廠模式,工廠方法或者類生成物件,而不是在**中直接new。

使用工廠模式,可以避免當改變某個類的名字或者方法之後,在呼叫這個類的所有的**中都修改它的名字或者引數

註冊模式

註冊模式,解決全域性共享和交換物件。已經建立好的物件,掛在到某個全域性可以使用的陣列上,在需要使用的時候,直接從該陣列上獲取即可。將物件註冊到全域性的樹上。任何地方直接去訪問。

介面卡模式

將各種截然不同的函式介面封裝成統一的api。

php中的資料庫操作有mysql,mysqli,pdo三種,可以用介面卡模式統一成一致,使不同的資料庫操作,統一成一樣的api。類似的場景還有cache介面卡,可以將memcache,redis,file,apc等不同的快取函式,統一成一致。

首先定義乙個介面(有幾個方法,以及相應的引數)。然後,有幾種不同的情況,就寫幾個類實現該介面。將完成相似功能的函式,統一成一致的方法。

策略模式

策略模式,將一組特定的行為和演算法封裝成類,以適應某些特定的上下文環境。

eg:假如有乙個電商**系統,針對男性女性使用者要各自跳轉到不同的商品類目,並且所有的廣告位展示不同的廣告。在傳統的**中,都是在系統中加入各種if else的判斷,硬編碼的方式。如果有一天增加了一種使用者,就需要改寫**。使用策略模式,如果新增加一種使用者型別,只需要增加一種策略就可以。其他所有的地方只需要使用不同的策略就可以。

首先宣告策略的介面檔案,約定了策略的包含的行為。然後,定義各個具體的策略實現類。

觀察者模式

1:觀察者模式(observer),當乙個物件狀態發生變化時,依賴它的物件全部會收到通知,並自動更新。

2:場景:乙個事件發生後,要執行一連串更新操作。傳統的程式設計方式,就是在事件的**之後直接加入處理的邏輯。當更新的邏輯增多之後,**會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件的主體**。

3:觀察者模式實現了低耦合,非侵入式的通知與更新機制。

定義乙個事件觸發抽象類。

原型模式

原型模式(物件轉殖以避免建立物件時的消耗)

1:與工廠模式類似,都是用來建立物件。

2:與工廠模式的實現不同,原型模式是先建立好乙個原型物件,然後通過clone原型物件來建立新的物件。這樣就免去了類建立時重複的初始化操作。

3:原型模式適用於大物件的建立,建立乙個大物件需要很大的開銷,如果每次new就會消耗很大,原型模式僅需要記憶體拷貝即可。

裝飾器模式

1:裝飾器模式,可以動態的新增修改類的功能

2:乙個類提供了一項功能,如果要在修改並新增額外的功能,傳統的程式設計模式,需要寫乙個子類繼承它,並重寫實現類的方法

3:使用裝飾器模式,僅需要在執行時新增乙個裝飾器物件即可實現,可以實現最大額靈活性。

php中的設計模式 裝飾模式

裝飾模式 所謂裝飾模式就是讓程式一層一層的包下來,像是大口袋套小口袋。例 php view plain copy class 食物 function getcost 被裝飾者類 class 公尺飯 extends 食物 裝飾者類與被裝飾者繼承自同乙個基類 class 菜 extends 食物 細分的...

php中的設計模式之 策略模式

所謂策略模式是在不同的事件策略模式就是針對相同的行為,在不同的場景中擁有不同的演算法,將這些演算法封裝起來,並且這些演算法是可以互換的,這樣就對客戶隱藏了相應演算法的實現細節,可以很方便的在執行時選擇具體的行為演算法 即策略 簡單的策略模式 保安對於學生和老師進考場這個事件,可以分化出不同的策略,學...

介紹php設計模式中的工廠模式

問題 你如何能輕鬆方便地建立這麼 複雜 n程式設計客棧bsp 的物件即操作中不需要貼上複製呢?解決方法 建立乙個工廠 乙個函式或乙個類方法 來製造新的物件。為了理解工廠的用處,試想以下的不同之處 複製 如下 connection new mysqlconnection user,password,d...