天天看點

四、建立型模式——抽象工廠模式

工廠方法模式我們會發現 (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)增加新的産品等級結構

四、建立型模式——抽象工廠模式

增加産品等級結構,我們就要修改所有工廠角色,給每個工廠類都增加一個新的工廠方法,這就違背了開閉原則, 是以不可以增加新的産品等級結構。