工廠方法模式我們會發現 (1)多個具體産品類都衍生自同一個接口或抽象類。 (2)一個抽象工廠類,可以派生出多個具體工廠類。 (3)并且每個具體工廠類隻能建立 一個 具體産品類的執行個體。 而抽象工廠模式是上述模式的更新版: (1)多個抽象産品類,每個抽象産品類可以派生出多個具體産品類。 (2)一個抽象工廠類,可以派生出多個具體工廠類。(同工廠方法模式) (3)并且每個具體工廠類可以建立 多個 具體産品類的執行個體。
1.抽象工廠模式模式介紹 為建立 一組 相關或者是互相依賴的對象提供的一個接口,而不需要指定它們的具體類。 抽象工廠模式包括的角色: (1) 抽象産品類 :為各種産品聲明抽象 接口或抽象類 。 (2) 具體産品類 :抽象産品類的實作類,為實作某個 具體産品 的對象。 (3) 抽象工廠類 :聲明了 一組 (注意是一組,看了下面的例子就會明白和工廠方法模式的差別)用于建立 一種産品(每一個方法對應一種産品) 的方法。 (4) 具體工廠類 :繼承抽象工廠類,生成 一組 具體産品(注意是一組,這很重要)。
2. 抽象工廠模式的實作 下面是兩輛車的例子 ,有兩款車内空調品牌,分别為海爾和海信。也有兩種發動機品牌,分别為國産和進口。( 抽象工廠模式有多個産品抽象類,分别為空調抽象類和發動機抽象類 ) 對于A類車,搭載的是海爾空調和進口發動機。對于B類車,搭載的是海信空調和國産發動機。 (1)空調接口和具體空調類
public interface Airconditioner {
void work();
}
//具體産品
public class Airconditioner_Haier implements Airconditioner {
@override
public void work() {
System.out.println(" Air_conditioner_Haier is working ...");
}
}
public class Airconditioner_HaiXin implements Airconditioner {
@override
public void work() {
System.out.println(" Air_conditioner_HaiXin is working ...");
}
}
(2)發動機接口和具體發動機類
public interface Engine {
void work();
}
//具體産品
public class Engine_Import implements Engine {
@override
public void work() {
System.out.println(" Engine_Import is working...");
}
}
public class Engine_Domestic implements Engine {
@override
public void work() {
System.out.println(" Engine_Domestic is working. ...");
}
}
(3)車接口及具體車類(抽象工廠和具體工廠)
public interface Abstract_CarFactory {
public Airconditioner install_air_conditioner();
public Engine install_engine();
}
//具體工廠A類
public class CarA implements AbstractFactory {
public Airconditioner install_air_conditioner () {
return new Airconditioner_Haier();
}
public Engine install_engine () {
return new Engine_Import();
}
}
//具體工廠B類
public class CarB implements AbstractFactory {
public Airconditioner install_air_conditioner () {
return new Airconditioner_HaiXin();
}
public Engine install_engine () {
return new Engine_Domestic();
}
}
(4)客戶調用
Abstract_CarFactory factoryA = new CarA();
factoryA. install_air_conditioner.work();
factoryA. install_engine().work();
Abstract_CarFactory factoryB = new CarB();
factoryB. install_air_conditioner.work();
factoryB. install_engine().work();
3. 抽象工廠模式的優缺點 抽象工廠模式的優點 (1)具有工廠方法模式 解耦的優點 。 (2)工廠模式針對的是 一個産品等級結構 ,抽象工廠模式針對的是面向 多個産品等級結構 的。 最主要的是可以在類内部對 産品族 的 關聯關系進行定義和描述。 【重要拓展概念】 産品族的概念: 所謂的産品族,是指 位于 不同産品等級結構中功能相關聯的産品 組成的家族。 舉例說明, EngineA和EngineB即為兩個不同的等級結構 ,他們都衍生于Engine類。但是這裡有海爾、海信兩種空調,并且這兩種空調都搭載到兩種車子内(從這兩個次元看,是有四種類型的車子了)。 那麼搭載海爾空調和國産發動機的車A就是一個産品族,而不同的空調就是産品等級體系結構 抽象工廠模式的缺點 (1)産品族的 擴充将是一件十分費力的事情 ,假如産品族中需要增加一個新的産品,則幾乎所有的工廠類都需要進行修改。 (2)在具體工廠類的方法中,對于産品族裡的産品,隻能使用其中一個。這也比較容易了解,比如,一款車子不可以搭載兩種空調。
4.抽象工廠模式什麼時候使用 (1)同屬于一個産品族的産品是在一起使用的,比如國産發動機和海爾空調同時在車A工廠中使用 (2)有多個抽象産品類
5.抽象工廠開閉原則的實作 (1)增加新的産品族 增加新的具體工廠類 (2)增加新的産品等級結構
增加産品等級結構,我們就要修改所有工廠角色,給每個工廠類都增加一個新的工廠方法,這就違背了開閉原則, 是以不可以增加新的産品等級結構。