目錄
1、核心思想
2、實現方式
2.1 模式結構
2.2 實現案例
3、優缺點分析
4、適用場景
1、核心思想
目的:統一管理相關對象的創建,確保產品兼容性。優先用于需要強約束產品兼容性的場景(如UI主題、跨平臺適配)
概念:抽象工廠模式是工廠方法模式的擴展,適用于需要生成產品家族的場景。抽象工廠模式一定是基于產品的族系劃分(一組功能相關或依賴的對象)來布局的,其產品系列一定是相對固定的,故以抽象工廠來確立工業制造標準(各產品系列生產接口)?。
舉例:以汽車工廠舉例,按品牌劃分為A工廠和B工廠(兩個族系),這兩個品牌都有轎車、越野車、跑車3個系列的產品。基于這兩個品牌的汽車工廠的系列生產線,如果以后加入新的C品牌汽車、D品牌汽車等,都可以沿用此種規劃好的生產模式,這便是抽象工廠模式的基礎數據模型。
?
2、實現方式
2.1 模式結構
四個核心角色:
-
抽象產品(AbstractProduct):定義一類產品的接口(如 轎車、越野、跑車)。
-
具體產品(ConcreteProduct):實現抽象產品接口的類(如 A品牌轎車、B品牌轎車...)。
-
抽象工廠(AbstractFactory):聲明創建產品族中每個產品的方法(如?
create轎車()
,?create越野()
,?create跑車()
)。 -
具體工廠(ConcreteFactory):實現抽象工廠接口,生成同一產品族的具體對象(如A品牌工廠、B品牌工廠)。
2.2 實現案例
// 1、抽象產品
// 轎車
public interface Car {void runCar();
}
// 越野車
public interface SuvCar {void runSuvCar();
}
// 跑車
public interface SportsCar {void runSportsCar();
}// 2、具體產品
// A品牌轎車
public class ABrandCar implements Car{@Overridepublic void runCar() {System.out.println("A品牌轎車運行");}
}
// A品牌越野車
public class ABrandSuvCar implements SuvCar {@Overridepublic void runSuvCar () {System.out.println("A品牌越野車運行");}
}
// A品牌跑車
public class ABrandSportsCar implements SportsCar {@Overridepublic void runSportsCar () {System.out.println("A品牌跑車運行");}
}
// B品牌轎車
public class BBrandCar implements Car{@Overridepublic void runCar() {System.out.println("B品牌轎車運行");}
}
// B品牌越野車
public class BBrandSuvCar implements SuvCar {@Overridepublic void runSuvCar () {System.out.println("B品牌越野車運行");}
}
// B品牌跑車
public class BBrandSportsCar implements SportsCar {@Overridepublic void runSportsCar () {System.out.println("B品牌跑車運行");}
}// 3、抽象工廠
public interface BrandFactory {Car createCar();SuvCar createSuvCar();SportsCar createSportsCar();
}// 4、具體工廠
// A品牌工廠
public class ABrandFactory implements BrandFactory{@Overridepublic Car createCar() {return new ABrandCar();}@Overridepublic SuvCar createSuvCar() {return new ABrandSuvCar();}@Overridepublic SportsCar createSportsCar() {return new ABrandSportsCar();}
}
// B品牌工廠
public class BBrandFactory implements BrandFactory{@Overridepublic Car createCar() {return new BBrandCar();}@Overridepublic SuvCar createSuvCar() {return new BBrandSuvCar();}@Overridepublic SportsCar createSportsCar() {return new BBrandSportsCar();}
}// 5、客戶端
public class Application {public static void main(String[] args) {BrandFactory factory = new ABrandFactory();factory.createCar();factory.createSuvCar();factory.createSportsCar();factory = new BBrandFactory();factory.createCar();factory.createSuvCar();factory.createSportsCar();}
}
3、優缺點分析
優點 | 缺點 |
---|---|
保證產品族兼容性 | 新增產品類型需修改所有工廠接口 |
客戶端與具體類解耦 | 代碼復雜度高(類數量成倍增加) |
支持靈活切換產品族(如切換主題) | 難以擴展新產品(違反開閉原則) |
工廠方法模式與抽象工廠模式對比:
維度 | 工廠方法模式 | 抽象工廠模式 |
---|---|---|
核心目的 | 創建單一類型對象 | 創建相關/依賴的對象家族 |
產品維度 | 處理一個產品等級結構(垂直方向) | 處理多個產品等級結構(水平方向) |
接口復雜度 | 單一工廠方法 | 包含多個工廠方法的接口 |
擴展方向 | 新增產品類型需修改代碼 | 新增產品家族易擴展,新增產品類型難 |
典型應用場景 | 日志記錄器、數據庫連接器等單一產品場景 | 跨平臺UI組件、主題系統等系列產品場景 |
子類數量 | 每個產品對應一個子類工廠 | 每個產品家族對應一個子類工廠 |
4、適用場景
-
跨平臺應用:跨平臺UI組件開發(Windows/Mac風格)
-
主題系統:切換整體風格(如深色/淺色主題)。
-
數據庫兼容:企業級應用的多數據庫適配(連接器+查詢器+事務管理器)
-
游戲開發:游戲引擎的多主題支持(中世紀/科幻風格)