工廠模式,控制反轉(依賴注入)

2021-07-10 10:22:59 字數 2386 閱讀 5199

在介紹工廠模式與控制反轉(inversion of control)及依賴注入(dependency injection)之前,先介紹下類的呼叫方法。目前呼叫方法總共有3種:1.自己建立;2.工廠模式;3.外部注入,其中外部注入即為控制反轉/依賴注入模式(ioc/di)。我們可以用3個形象的東西來分別表示它們,就是new、get、set。顧名思義,new表示自己建立,get表示主動去取(即工廠),set表示是被別人送進來的(即注入),其中get和set分別表示了主動去取和等待送來兩種截然相反的特性,這3個單詞代表了3種方法的思想精髓。     無論是那一種方法,都存在兩個角色,那就是呼叫者和被呼叫者。下面我們通過例項來講解這3種方法的具體含義。首先,我們設定呼叫物件為學生物件student,被呼叫者物件為圖書物件book,要設計的**功能是學生學習圖書。我們一般習慣於一種思維程式設計方式:介面驅動,可以提供不同靈活的子類實現:

//book介面 

public inte***ce ibook 

//booka實現類 

public class booka implements ibook  

//bookb實現類 

public class bookb implements ibook

}下面就來演示這三種方法是如何呼叫圖書類的

1) new 自己建立

public class student  

public void learnbookb()  

}         public void learnbookb()  

}該方法在呼叫者student需要呼叫被呼叫者ibook時,需要自己來建立乙個ibook物件。這種做法的缺點是無法更換被呼叫者,並且要負責被呼叫者的整個生命週期。

2)get  工廠模式

//圖書工廠 

public class bookfactory 

public static ibook getbookb()  

}//學生類

public class student  

public void learnbookb() }

此時多了乙個工廠類,將物件建立提取到工廠類中,呼叫者無需考慮物件的建立,只管從工廠中拿,

在修改被呼叫者是也無需改動太多的**。但是,物件的建立依然不靈活,以為兌現的取得完全取決於工廠,有多了一道中間的工序。

3)set 外部注入

此時多了乙個工廠類,將物件建立提取到工廠類中,呼叫者無需考慮物件的建立,只管從工廠中拿,

在修改被呼叫者是也無需改動太多的**。但是,物件的建立依然不靈活,以為兌現的取得完全取決於工廠,有多了一道中間的工序。

3.1) 介面注入

public class student

}    

通過動態的建立booka的例項來注入,這種方式仍然依賴於ibook的實現。

3.2) 構造注入

依賴關係是通過類的建構函式建立的,容器通過呼叫類的構造方法,將其所需的依賴關係注入其中。 

public class student  

public void learn() } 

public class factory ; trycatch (exception e) 

return student1;     } }

這樣就通過factory.getinstance()直接獲取又有屬性booka的乙個student例項。

3.設定注入 

受控物件通過屬性來表達自己所以來的物件和所需配置的值。只要為物件新增setter方法即可。 

public class student  

public void setbooka(booka booa) 

public void learn() }

public class factory ; try;      object obj = student.newinstance();      method.invoke(obj,book);      student student1 = (student) obj; }catch (exception e) 

return student1;     } 

public static string change(string str) } 

這樣只需呼叫factory.getinstance("booka")即可獲得student的例項。 

依賴注入的優點在於在容器中定義物件,容器會自動組建出乙個例項,缺點就是生成乙個物件的步驟變得複雜了,對於不習慣這種方式的人會覺得有些彆扭和不直觀。 

總結:從工廠模式到依賴注入,搞得那麼複雜究竟為了什麼呢?工廠模式的作用就是將物件的建立擊中到工廠容器中,這樣對於物件的修改也集中到容器中進行,便於維護。而工廠模式由於不通用,故對於不同的物件就需要在容器中建立不同的方法,因此利用基於反射機制的動態程式設計技術又可以解決此問題,但是生成物件的過程越來越繁瑣。

工廠模式 控制反轉及依賴注入

工廠模式 控制反轉及依賴注入 工廠模式原本作為高階篇的乙個篇章 其難度充其量就那個難度 但是考慮與本章的聯絡,所以併入本章。在介紹工廠模式與控制反轉 inversion of control 及依賴注入 dependency injection 之前,先介紹下類的呼叫方法。目前呼叫方法總共有3種 1...

工廠模式 控制反轉及依賴注入

在介紹工廠模式與控制反轉 inversion of control 及依賴注入 dependency injection 之前,先介紹下類的呼叫方法。目前呼叫方法總共有3種 1.自己建立 2.工廠模式 3.外部注入,其中外部注入即為控制反轉 依賴注入模式 ioc di 我們可以用3個形象的東西來分別...

設計模式 控制反轉 依賴注入

一 控制反 從簡單的 示例入手 郵件服務類 public class emailservice 郵件通知類 public class notifycationsystem 共兩個類,乙個郵件服務類,乙個郵件通知類,郵件通知類依賴於郵件服務類。郵件通知類必須精確的知道建立和使用了哪種型別的服務,此處高...