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