抽象工廠模式(Abstract Factory Pattern):
是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。
在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。
抽象工廠模式提供了一種創建一系列相關或相互依賴對象的接口,而無需指定具體實現類。通過使用抽象工廠模式,可以將客戶端與具體產品的創建過程解耦,使得客戶端可以通過工廠接口來創建一族產品。
意圖:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
主要解決:主要解決接口選擇的問題。
何時使用:系統的產品有多于一個的產品族,而系統只消費其中某一族的產品。
如何解決:在一個產品族里面,定義多個產品。
關鍵代碼:在一個工廠里聚合多個同類產品。
優點:當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼。
注意事項:產品族難擴展,產品等級易擴展。
抽象工廠模式包含以下幾個核心角色:
- 抽象工廠(Abstract Factory):聲明了一組用于創建產品對象的方法,每個方法對應一種產品類型。抽象工廠可以是接口或抽象類。
- 具體工廠(Concrete Factory):實現了抽象工廠接口,負責創建具體產品對象的實例。
- 抽象產品(Abstract Product):定義了一組產品對象的共同接口或抽象類,描述了產品對象的公共方法。
- 具體產品(Concrete Product):實現了抽象產品接口,定義了具體產品的特定行為和屬性。
抽象工廠模式通常涉及一族相關的產品,每個具體工廠類負責創建該族中的具體產品。客戶端通過使用抽象工廠接口來創建產品對象,而不需要直接使用具體產品的實現類。
===================================================================以上八股文來自 菜鳥教程,它從哪里來的不清楚 !!!!==============================================================
舉個小例子:
某個產品, 需要提供多個數據庫支持(抽象工廠) ,比如 mysql 、 DB2 、Oracle 等等( 即一系列具體產品) ,項目又被多個子公司使用 (各個子公司 就是 具體工廠), 各個子公司 有的用 mysql 有的用 DB2 或者兩個都用 進行增刪改查(某一具體產品)

大概就是這么個情況。。。。。
代碼如下:
1. 創建 數據庫服務 抽象工廠
public abstract class DBServerFactory { public abstract MysqlServer createMysqlServer(); public abstract DB2Server createDB2Server(); }
2.創建 mysql db2 是數據庫 產品 接口
// mysql
public interface MysqlServer { public String mysqlJdbc(); public String mysqlSelect(); public String mysqlSave(); }
//db2
public interface DB2Server {
public String db2Jdbc();
public String db2Select();
public String db2Save();
}
3.創建 子公司 使用 實現
//iphone 公司使用db2
public class IphoneDB2 implements DB2Server {
private final String factoryName= "Iphone";
@Override
public String db2Jdbc() {
return factoryName + " db2 jdbc://xxxxxxxxxx";
}
@Override
public String db2Select() {
return factoryName + " db2 select User ==== 11";
}
@Override
public String db2Save() {
return factoryName + " db2 insert User ==== 22";
}
}
//iphone 公司使用mysql
public class IphoneMysql implements MysqlServer {
private final String factoryName= "iphone";
@Override
public String mysqlJdbc() {
return factoryName + " mysql jdbc://xxxxxxxxxx";
}
@Override
public String mysqlSelect() {
return factoryName + " mysql select User ==== 11";
}
@Override
public String mysqlSave() {
return factoryName + " mysql insert User ==== 22";
}
}
// kite 公司使用db2
public class KiteDB2 implements DB2Server {
private final String factoryName= "kite";
@Override
public String db2Jdbc() {
return factoryName + " db2 jdbc://xxxxxxxxxx";
}
@Override
public String db2Select() {
return factoryName + " db2 select User ==== 11";
}
@Override
public String db2Save() {
return factoryName + " db2 insert User ==== 22";
}
}
4. 創建 子公司(子工廠)
// iPhone 子工廠
public class IphoneFactory extends DBServerFactory{ @Override public MysqlServer createMysqlServer() { return new IphoneMysql(); } @Override public DB2Server createDB2Server() { return new IphoneDB2(); } }
// kite(子工廠) public class KiteFactory extends DBServerFactory { @Override public MysqlServer createMysqlServer() { return null; } @Override public DB2Server createDB2Server() { return new KiteDB2(); } }
5. 使用 main 方法
public static void main(String[] args) { //iphone DBServerFactory iphoneFactory = new IphoneFactory();
//kite DBServerFactory kiteFactory = new KiteFactory(); MysqlServer mysqlServer = iphoneFactory.createMysqlServer(); DB2Server iphoneDB2Server = iphoneFactory.createDB2Server();
DB2Server kiteDB2Server = kiteFactory.createDB2Server(); System.out.println(mysqlServer.mysqlJdbc()); System.out.println(mysqlServer.mysqlSelect()); System.out.println(mysqlServer.mysqlSave()); System.out.println(kiteDB2Server.db2Jdbc()); System.out.println(kiteDB2Server.db2Select()); System.out.println(iphoneDB2Server.db2Jdbc()); System.out.println(iphoneDB2Server.db2Select()); System.out.println(iphoneDB2Server.db2Save()); }
6.結果

7.項目結構

==========================================收工=================================================================================
浙公網安備 33010602011771號