摘要:滿足此要求的簡單模式是在創(chuàng)建新實例時將資源傳遞給構(gòu)造函數(shù)。依賴注入同樣適用于構(gòu)造函數(shù)靜態(tài)工廠第項和構(gòu)建器第項。將資源工廠傳遞給構(gòu)造函數(shù)就會變成一個有用的模式。這種做法稱為依賴注入,將極大地增強類的靈活性,可重用性和可測試性。
??許多類依賴于一個或多個底層資源。 例如,拼寫檢查器依賴于字典。常見的做法是將這些類實現(xiàn)為靜態(tài)實用程序類(第4項):
// Inappropriate use of static utility - inflexible & untestable! public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // Noninstantiable public static boolean isValid(String word) { ... } public static Listsuggestions(String typo) { ... } }
??同樣的,將它們作為單例實現(xiàn)的情況并不少見(第3項):
// Inappropriate use of singleton - inflexible & untestable! public class SpellChecker { private final Lexicon dictionary = ...; private SpellChecker(...) {} public static INSTANCE = new SpellChecker(...); public boolean isValid(String word) { ... } public Listsuggestions(String typo) { ... } }
??這些方法都不令人滿意,因為它們假設(shè)只有一本值得使用的字典。 在實踐中,每種語言都有自己的字典,特殊字典用于特殊詞匯。 而且,可能需要使用特殊字典進行測試。 假設(shè)單本字典就足以滿足所有情況,這是一廂情愿的想法。
??你可以嘗試讓SpellChecker支持多個詞典,方法是使字典字段為非final域,并添加一個方法來更改現(xiàn)有拼寫檢查器中的字典,但這在并發(fā)時設(shè)置會很笨拙,容易出錯并且不可行。 靜態(tài)實用程序類和單例不適用于底層資源作為參數(shù)的類(Static utility classes and singletons are inappropriate for classes whose behavior is parameterized by an underlying resource.)。
??所需要的是能夠支持類的多個實例(在我們的示例中為SpellChecker),每個實例都使用客戶端所需的資源(在我們的示例中為字典)。 滿足此要求的簡單模式是在創(chuàng)建新實例時將資源傳遞給構(gòu)造函數(shù)。 這是依賴注入的一種形式:字典是拼寫檢查器的依賴項,并在創(chuàng)建時注入拼寫檢查器。
// Dependency injection provides flexibility and testability public class SpellChecker { private final Lexicon dictionary; public SpellChecker(Lexicon dictionary) { this.dictionary = Objects.requireNonNull(dictionary); } public boolean isValid(String word) { ... } public Listsuggestions(String typo) { ... } }
??這種依賴注入很簡單,以至于程序猿用了很多年卻不知道它有一個名稱。雖然我們的拼寫檢查器只有一個資源(字典),但是依賴注入可以使用任意數(shù)量的資源和任意的依賴關(guān)系,它保留了不變性(第17項),因此多個客戶端可以共享依賴對象(假設(shè)客戶端需要相同的底層資源)。依賴注入同樣適用于構(gòu)造函數(shù)、靜態(tài)工廠(第1項)和構(gòu)建器(第2項)。
??將資源工廠傳遞給構(gòu)造函數(shù)就會變成一個有用的模式。工廠是一個對象,通過重復調(diào)用這個工廠可以創(chuàng)建某個類型的實例對象。這些就是工廠方法模式 [Gamma95]。Java 8中引入的Supplier
Mosaic create(Supplier extends Tile> tileFactory) { ... }
??盡管依賴注入極大地提高了靈活性和可測試性,但它可能會使大型項目更加混亂,這些項目通常包含數(shù)千個依賴項。通過使用依賴注入框架,例如Dagger [Dagger],Guice [Guice]或Spring [Spring],可以消除這種混亂。這些框架的使用超出了本書的范圍,但請注意,為手動依賴注入而設(shè)計的API可以輕松地適用于這些框架。
??總之,如果有一個類依賴一個或多個底層資源的類,并且底層資源類影響了類的行為,不要使用單例或靜態(tài)實用程序類來實現(xiàn)它,并且不要讓類直接創(chuàng)建這些資源(do not use a singleton or static utility class to implement a class that depends on one or more underlying resources whose behavior affects that of the class)。相反,將資源或工廠傳遞給構(gòu)造函數(shù)(或靜態(tài)工廠或構(gòu)建器)。這種做法稱為依賴注入,將極大地增強類的靈活性,可重用性和可測試性。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/73935.html
摘要:關(guān)于依賴注入注入的注解提供的注解不僅僅是對象,還有在構(gòu)造器上,還能用在屬性的方法上。與之相反,的限定符能夠在所有可選的上進行縮小范圍的操作,最終能夠達到只有一個滿足所規(guī)定的限制條件。注解是使用限定符的主要方式。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... Spring致力于提供一種方法管理你的業(yè)務(wù)對象。在大量Java EE的應(yīng)用中,隨處可...
摘要:由一層函數(shù)調(diào)用進入下一層函數(shù)調(diào)用的遞推。此時,中的一個稱為孤兒的類就會收留這個對象。禁止訪問服務(wù)器拒絕請求服務(wù)器找不到請求的頁面服務(wù)器內(nèi)部錯誤壞的網(wǎng)關(guān)一般是網(wǎng)關(guān)服務(wù)器請求后端服務(wù)時,后端服務(wù)沒有按照協(xié)議正確返回結(jié)果。 持續(xù)更新。。。。 php 1. 簡述 php 中的 autoload Autoload 的加載機制,當通過 new 來實例化一個類時,PHP 會通過定義的 autol...
摘要:一個類可以提供一個公共靜態(tài)工廠方法,它僅僅是一第項遇到多個構(gòu)造器參數(shù)時要考慮使用構(gòu)建器靜態(tài)工廠和構(gòu)造器有個共同的局限性他們都不能很好地擴展到大量的可選參數(shù)。 ??本章涉及創(chuàng)建和銷毀對象,包括何時以及如何創(chuàng)建它們,何時以及如何避免創(chuàng)建它們,如何確保它們被及時銷毀,以及如何管理在銷毀之前必須進行的清理操作。 第1項:用靜態(tài)工廠方法代替構(gòu)造器 ??類允許客戶端獲取實例的傳統(tǒng)方法是提供公共構(gòu)造...
閱讀 2300·2021-11-24 11:15
閱讀 3186·2021-11-24 10:46
閱讀 1482·2021-11-24 09:39
閱讀 3992·2021-08-18 10:21
閱讀 1539·2019-08-30 15:53
閱讀 1460·2019-08-30 11:19
閱讀 3390·2019-08-29 18:42
閱讀 2424·2019-08-29 16:58