接口 interface 是一種特殊的抽象類,可以實現多重繼承,即一個類可以實現多個接口。
工廠方法的設計模式充分利用接口,將設計生產者與使用者(消費者)隔離。
FactoryMethod 模式是設計模式中應用最爲廣泛的模式,在面向對象的編程中,對象的創建工作非常簡單,對象的創建時機卻很重要。FactoryMethod 解決的就是這個問題,它通過面向對象的手法,將所要創建的具體對象的創建過程延遲到了子類,從而提供了一種擴展的策略,較好的解決了這種緊耦合的關係。
上圖中左邊爲傳統的方法,如果開發人員想修改類的名稱或其他信息,會直接影響 B 的代碼也要做相應的修改,這樣是不合理的。
通過右邊的方法可以解決這個問題。A 首先創建一個汽車的接口 BWM ,來實現各個系列車的構建。下面一步是關鍵,再創建一個工廠接口,分別構建各個汽車生產工廠的類,返回的是各個汽車的類。
所以 B 只需要調用這個工廠接口就行了。這時候 A 不管怎麼修改汽車類,都不會影響 B 的代碼。
具體見代碼:
下面是開發人員 A 的代碼,寶馬汽車的構建:
/**
* 寶馬汽車的接口
*/
public interface BMW {
void showInfo();
}
/**
* 寶馬3系類
*/
class BMW3 implements BMW {
@Override
public void showInfo() {
System.out.println("寶馬3系車");
}
}
/**
* 寶馬5系類
*/
class BMW5 implements BMW {
@Override
public void showInfo() {
System.out.println("寶馬5系車");
}
}
/**
* 寶馬7系類
*/
class BMW7 implements BMW {
@Override
public void showInfo() {
System.out.println("寶馬7系車");
}
}
下面是開發人員 A 的代碼,寶馬汽車工廠類的構建:
/**
* 寶馬汽車工廠的接口
*/
public interface BMWFactory {
BMW productCar();
}
class BMW3Factory implements BMWFactory {
@Override
public BMW productCar() {
System.out.println("這是BMW3的生成工廠");
return new BMW3();
}
}
class BMW5Factory implements BMWFactory {
@Override
public BMW productCar() {
System.out.println("這是BMW5的生成工廠");
return new BMW5();
}
}
class BMW7Factory implements BMWFactory {
@Override
public BMW productCar() {
System.out.println("這是BMW7的生成工廠");
return new BMW7();
}
}
下面是開發人員 B 的代碼,通過工廠接口獲取汽車的信息:
public static void main(String[] args) {
//無論開發人員 A 怎麼修改汽車的類,只需要他同步修改工廠類即可,不會影響 B 這裏的使用
BMW car3 = new BMW3Factory().productCar();
car3.showInfo();
BMW car5 = new BMW5Factory().productCar();
car5.showInfo();
BMW car7 = new BMW7Factory().productCar();
car7.showInfo();
}
返回結果:
這是BMW3的生成工廠
寶馬3系車
這是BMW5的生成工廠
寶馬5系車
這是BMW7的生成工廠
寶馬7系車