抽象工廠模式(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.專案結構
==========================================收工=================================================================================