java 抽象工廠模式

zy平平仄仄發表於2024-04-13

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

==========================================收工=================================================================================

相關文章