通常在程式撰寫上,若要由A呼叫B,通常都是直接以"主動"的方式去呼叫。
A → B
主動建立
在這結構中過程中加入IoC/DI容器,會變得如何?(注意箭頭方向)
A ← IoC/DI Container → B
被動
此時A取得B instance時是採被動方式,由IoC/DI Container先取得B instance再植入A。
IoC及DI,其實只是針對同一件事情,以不同的角度去描述。
IoC -- Inversion Control (控制反轉)
容器控制應用程式,由容器反向的向應用程式植入其所需的外部資源。
DI -- Dependency Injection (相依植入)
應用程式建立相依容器且植入所需的外部資源。
IoC/DI Container,可有效分離物件和其所需要的外部資源,使它們鬆散耦合,亦有利於功能重用,更使得程式整個體系結構變得更加靈活。
以下為IoC/DI程式範例
public class A {
//等待被植入
private B b = null ;
//植入資源B
public void setB(B b) {
this.b = b;
}
public void t1() {
//此時要使用b,但不主動去建立,直接呼叫使用。
b.tc();
}
}
public interface B {
public void tc();
}
由此程式碼可見,A要使用B時,需等待instance被植入,此範例就不實作IoC/DI Container。
流風羽 發表在 痞客邦 留言(0) 人氣(585)
程式在撰寫的過程中,如何善用資源是非常重要的事情。
以下就拿Singleton(單例模式) Class各別以"懶惰式"及"飢餓式"的寫法來做個比較。
所謂懶惰式,就是要用到時才會去建立instance,如以下程式碼。
public class Singleton {
private static Singleton instance = null ;
private Singleton () {
}
public static Singleton getInstance () {
//判斷instance變數是否有值。
if(instance == null ) {
//若無,則建立一class instance並assigne給instance變數。
instance = new Singleton();
}
//若有值,則直接回傳。
return instance;
}
}
以上可見,instance是在client呼叫getInstance method才會判斷是否有值,若無值才會建立instance,此種採被動的方式稱為懶惰式。
以下為飢餓式的寫法。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton () {
}
public static Singleton getInstance () {
//直接回傳instance。
return instance;
}
}
之所以會稱為飢餓式,是因為此instance是static變數,故在類別載入時就會進行初始化,即立即產生一個instance,即為主動的方式。
以上,懶惰式實現了Lazy Load,也就是延遲載入的概念,這是在實際開發中很常見的思想,盡量節省資源使用;而飢餓式是在類別載入時立即建立instance;以上,為這兩種開發方式的介紹,可視情況擇一使用。
流風羽 發表在 痞客邦 留言(0) 人氣(177)
由於這兩個模式非常相似,不過卻有著基本區別。
外觀模式
1. 主要的封裝模式是單向的互動,只有從用戶端存取系統的呼叫,沒有從系統中存取用戶端的呼叫。
2. 一般是"組合呼叫"或是"轉調"內部實現的功能,通常本身並不實現這些功能。
3. 主要目的是為了簡化用戶端的呼叫。
仲介者模式
1. 主要用來封裝多個物件之間相互的"互動",多用於系統內部的多個模組之間。
2. 必須實現實際互動功能。
3. 主要目的是鬆散多個模組之間的耦合,將這些偶合關係全放到仲介者模式中實現。
流風羽 發表在 痞客邦 留言(0) 人氣(230)