PHP 設計模式答疑-物件池與依賴注入的區別

kuibatian發表於2019-11-26

物件池應用場景

對像池主在物件建立開銷較大或要控制物件數量的時候使用。最常見的物件池應該是資料庫連線池和執行緒池。

例如:

程式需要資料庫連線時從連線池中取一個(連線池裡有多個連線),用完了不是關閉連線而是把連線放回連線池給其他程式使用。

一個對像池通常只放同一類的物件。

為什麼有開銷較大的說法?

首先:
物件池服務可以減少從頭建立每個物件的系統開銷。

在需要物件時從池中提取,在使用完物件時,把它放回池中,等待下一個請求。物件池使你能夠控制所使用的物件數量。

在PHP的長駐程式模式下,物件池尤其重要.

由於PHP的GC缺陷,在高併發下,PHP常駐程式內直接通過new建立物件,會導致PHP程式佔用大量的記憶體,而且很容易出現OOM(out of memory)

物件池特性

  • 建立固定數量的物件;
  • 需要時從池中提取,不需要時歸還池中;
  • 自動歸還物件;
  • 根據有效期和使用次數淘汰物件

物件池實現原理

file

什麼是依賴注入

依賴注入,是指物件在被建立的時候,由一個調控系統內所有物件的外界實體,將其所依賴的物件的引用,傳遞給它。

例如:

A物件需要引用B物件的話,可以在A的建構函式裡面將B傳遞進去,或者呼叫A的某個set方法。

通俗一點就是已經new好了, 要用直接取拿。

舉一個生活中的例子

依賴注入(DI)和控制反轉(IOC)是從不同的角度的描述的同一件事情,就是指通過引入IOC容器,利用依賴關係注入的方式,實現物件之間的解耦。
我們舉一個生活中的例子,來幫助理解依賴注入的過程。大家對USB介面和USB裝置應該都很熟悉吧,USB為我們使用電腦提供了很大的方便,現在有很多的外部裝置都支援USB介面。
現在,我們利用電腦主機和USB介面來實現一個任務:從外部USB裝置讀取一個檔案。
電腦主機讀取檔案的時候,它一點也不會關心USB介面上連線的是什麼外部裝置,而且它確實也無須知道。它的任務就是讀取USB介面,掛接的外部裝置只要符合USB介面標準即可。所以,如果我給電腦主機連線上一個U盤,那麼主機就從U盤上讀取檔案;如果我給電腦主機連線上一個外接硬碟,那麼電腦主機就從外接硬碟上讀取檔案。掛接外部裝置的權力由我作主,即控制權歸我,至於USB介面掛接的是什麼裝置,電腦主機是決定不了,它只能被動的接受。電腦主機需要外部裝置的時候,根本不用它告訴我,我就會主動幫它掛上它想要的外部裝置,你看我的服務是多麼的到位。這就是我們生活中常見的一個依賴注入的例子。在這個過程中,我就起到了IOC容器的作用。
通過這個例子,依賴注入的思路已經非常清楚:當電腦主機讀取檔案的時候,我就把它所要依賴的外部裝置,幫他掛接上。整個外部裝置註入的過程和一個被依賴的物件在系統執行時被注入另外一個物件內部的過程完全一樣。

  1. 都是節約開銷。
  2. 都是拿來就用,不需要自己new
  3. 物件池,不用了,放回去,會自動歸還和淘汰物件
  4. 依賴注入,是用的時候主動幫你掛上你要的依賴。沒歸還和自動淘汰這一說
  5. 一個對像池通常只放同一類的物件。

相關文章