以下內(nèi)容是我用來溫習(xí)的,從以下兩個博客總結(jié)而來,請關(guān)注原作者
ref:
服務(wù)定位模式(Service Locator Pattern)是一種軟件開發(fā)中的設(shè)計(jì)模式,可對涉及嘗試獲取一個服務(wù)的過程進(jìn)行封裝。該模式使用一個稱為 "Service Locator" 的中心注冊表來處理請求并返回處理特定任務(wù)所需的必要信息。
在首次請求某個服務(wù)時,服務(wù)定位器會查找服務(wù),沒有已經(jīng)存在的服務(wù),會新建并緩存該服務(wù)對象。當(dāng)再次請求相同的服務(wù)時,服務(wù)定位器會在它的緩存中查找,這樣可以在很大程度上提高應(yīng)用程序的性能。
優(yōu)點(diǎn)
把類與依賴項(xiàng)解耦,從而使這些依賴項(xiàng)可被替換或者更新。
類在編譯時并不知道依賴項(xiàng)的具體實(shí)現(xiàn)。
類的隔離性和可測試性非常好。
類無需負(fù)責(zé)依賴項(xiàng)的創(chuàng)建、定位和管理邏輯。
通過將應(yīng)用程序分解為松耦合的模塊,達(dá)成模塊間的無依賴開發(fā)、測試、版本控制和部署。
解決方案
創(chuàng)建一個 Service Locator,其包含各服務(wù)的引用,并且封裝了定位服務(wù)的邏輯。在類中使用 Service Locator 來獲取所需服務(wù)的實(shí)例。

Service Locator 模式并不描述如何實(shí)例化服務(wù),其描述了一種注冊和定位服務(wù)的方式。通常情況下,Service Locator 模式與工廠模式(Factory Pattern)和依賴注入模式(Dependency Injection Pattern)等結(jié)合使用。
服務(wù)定位器應(yīng)該能夠在不知道抽象類的具體類型的情況下定位到服務(wù)。例如,它可能會使用字符串或服務(wù)接口類型來映射服務(wù),這允許在無需修改類的條件下替換依賴項(xiàng)的具體實(shí)現(xiàn)。
實(shí)現(xiàn)細(xì)節(jié)
我們將創(chuàng)建 ServiceLocator、InitialContext、Cache、Service 作為表示實(shí)體的各種對象。Service1 和 Service2 表示實(shí)體服務(wù)。
ServiceLocatorPatternDemo,我們的演示類在這里是作為一個客戶端,將使用 ServiceLocator 來演示服務(wù)定位器設(shè)計(jì)模式。

注意事項(xiàng)
在使用 Service Locator 模式之前,請考慮以下幾點(diǎn):
有很多程序中的元素需要管理。
在使用之前必須編寫額外的代碼將服務(wù)的引用添加到服務(wù)定位器。
類將對服務(wù)定位器有依賴關(guān)系。
源代碼變的更加復(fù)雜和難以理解。
可以使用配置數(shù)據(jù)來定義運(yùn)行時的關(guān)系。
必須提供服務(wù)的實(shí)現(xiàn)。因?yàn)榉?wù)定位器模式將服務(wù)消費(fèi)者與服務(wù)提供者解耦,它可能需要提供額外的邏輯。這種邏輯將保證在服務(wù)消費(fèi)者嘗試定位服務(wù)之前,服務(wù)提供者已被安裝和注冊。
相關(guān)模式
依賴注入(Dependency Injection)。這種模式解決了與 Service Locator 模式相同的問題,但它使用不同的方法。
控制反轉(zhuǎn)(Inversion of Control)。Service Locator 模式是這種模式的特殊版本。它將應(yīng)用程序的傳統(tǒng)控制流程反轉(zhuǎn)。它用被調(diào)用對象來代替控制過程的調(diào)用方。