/** * @description:這是一個抽象工廠接口,下文的格力工廠和海爾工廠都實現了這個工廠接口 */ public interface Factory { //生產空調 AirConditioner getAirConditionerBean(); //生產冰箱 Refrigerator getRefrigeratorBean(); } /** * @description:格力廠自然生產的是格力的產品了 */ public class GreeFactory implements Factory { @Override public AirConditioner getAirConditionerBean() { return new GreeAirConditioner(); //生產格力空調 } @Override public Refrigerator getRefrigeratorBean() { return new GreeRefrigerator(); //生產格力冰箱 } } /** * @description:同理,海爾廠生產的是海爾的冰箱和空調 */ public class HaierFactory implements Factory { @Override public AirConditioner getAirConditionerBean() { return new HaierAirConditioner(); } @Override public Refrigerator getRefrigeratorBean() { return new HaierRefrigerator(); } }
/** * @description:這是一個空調接口,後面的格力空調和海爾空調都實現了此接口 */ public interface AirConditioner { void blowing(); } /** * @description:這是一個格力空調的實例 */ public class GreeAirConditioner implements AirConditioner { @Override public void blowing() { System.out.println("格力空調吹風了"); } } /** * @description:這是一個海爾空調的實例 */ public class HaierAirConditioner implements AirConditioner { @Override public void blowing() { System.out.println("海爾空調吹風了"); } } /** * @description: */ public interface Refrigerator { void refrigeration(); } public class GreeRefrigerator implements Refrigerator { @Override public void refrigeration() { System.out.println("格力冰箱啓動了"); } } public class HaierRefrigerator implements Refrigerator { @Override public void refrigeration() { System.out.println("海爾冰箱啓動了"); } }
/** * @author : * @date :Created in 5/26/2021 6:57 PM * @description: * @modified By: * @version: */ public class Start { public static void main(String[] args){ //先創建個格力工廠的實例 Factory greeFactory = new GreeFactory(); //用格力工廠生產格力空調 AirConditioner greeAirConditioner = greeFactory.getAirConditionerBean(); greeAirConditioner.blowing(); //格力空調吹風 //用格力工廠生產格力冰箱 Refrigerator greeRefrigerator = greeFactory.getRefrigeratorBean(); greeRefrigerator.refrigeration(); //格力冰箱啓動 //創建個海爾工廠的實例 Factory haierFactory = new HaierFactory(); //用海爾工廠生產海爾空調 AirConditioner haierAirconditioner = haierFactory.getAirConditionerBean(); haierAirconditioner.blowing(); //海爾空調吹風 //用海爾工廠生產海爾冰箱 Refrigerator haierRefrigerator = haierFactory.getRefrigeratorBean(); haierRefrigerator.refrigeration(); //海爾冰箱啓動 } } 輸出: 格力空調吹風了 格力冰箱啓動了 海爾空調吹風了 海爾冰箱啓動了
模式動機
-
在工廠方法模式中具體工廠負責生產具體的產品,每一個具體工廠對應一種具體產品,工廠方法也具有唯一性,一般情況下,一個具體工廠中只有一個工廠方法或者一組重載的工廠方法。但是有時候我們需要一個工廠可以提供多個產品對象,而不是單一的產品對象。
爲了更清晰地理解工廠方法模式,需要先引入兩個概念:
- 產品等級結構 :產品等級結構即產品的繼承結構,如一個抽象類是電視機,其子類有海爾電視機、海信電視機、TCL電視機,則抽象電視機與具體品牌的電視機之間構成了一個產品等級結構,抽象電視機是父類,而具體品牌的電視機是其子類。
- 產品族 :在抽象工廠模式中,產品族是指由同一個工廠生產的,位於不同產品等級結構中的一組產品,如海爾電器工廠生產的海爾電視機、海爾電冰箱,海爾電視機位於電視機產品等級結構中,海爾電冰箱位於電冰箱產品等級結構中。
-
當系統所提供的工廠所需生產的具體產品並不是一個簡單的對象,而是多個位於不同產品等級結構中屬於不同類型的具體產品時需要使用抽象工廠模式。
-
抽象工廠模式是所有形式的工廠模式中最爲抽象和最具一般性的一種形態。
-
抽象工廠模式與工廠方法模式最大的區別在於,工廠方法模式針對的是一個產品等級結構,而抽象工廠模式則需要面對多個產品等級結構,一個工廠等級結構可以負責多個不同產品等級結構中的產品對象的創建 。當一個工廠等級結構可以創建出分屬於不同產品等級結構的一個產品族中的所有對象時,抽象工廠模式比工廠方法模式更爲簡單、有效率。
模式定義
抽象工廠模式(Abstract Factory Pattern):提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,屬於對象創建型模式。
模式結構
抽象工廠模式包含如下角色:
- AbstractFactory:抽象工廠
- ConcreteFactory:具體工廠
- AbstractProduct:抽象產品
- Product:具體產品