1. 程式人生 > 其它 >構建基於Kafka中轉的混合雲線上資料同步-CloudCanal實戰

構建基於Kafka中轉的混合雲線上資料同步-CloudCanal實戰

定義

提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。

結構

  • ProductFactory,抽象產品工廠,聲明瞭一組建立一簇產品的工廠方法,每一個方法對應一種產品。
  • MobileProduct,ComputerProduct,抽象產品,工廠方法返回的介面型別。
  • HuaweiProductFactory,SamsungProductFactory,具體工廠,實現抽象工廠介面,工廠方法返回一簇具體產品。
  • HuaweiMobileProduct,HuaweiComputerProduct,具體產品,抽象產品的實現。

簡單實現

兩種抽象產品

/**
 * 手機產品
 */
public interface MobileProduct {

  void show();

}
/**
 * 電腦產品
 */
public interface ComputerProduct {

  void show();

}

抽象工廠

public interface ProductFactory {

  /**
   * 建立手機產品
   */
  MobileProduct createMobileProduct();

  /**
   * 建立電腦產品
   */
  ComputerProduct createComputerProduct();
}

具體工廠和具體產品

/**
 * 華為產品工廠
 */
public class HuaweiProductFactory implements ProductFactory {

  @Override
  public MobileProduct createMobileProduct() {
    return new HuaweiMobileProduct();
  }

  @Override
  public ComputerProduct createComputerProduct() {
    return new HuaweiComputerProduct();
  }

  public static class HuaweiMobileProduct implements MobileProduct {

    @Override
    public void show() {
      System.out.println("HuaweiMobileProduct show");
    }
  }

  public static class HuaweiComputerProduct implements ComputerProduct {

    @Override
    public void show() {
      System.out.println("HuaweiComputerProduct show");
    }
  }
}

第二個具體工廠實現

/**
 * 三星產品工廠
 */
public class SamsungProductFactory implements ProductFactory {

  @Override
  public MobileProduct createMobileProduct() {
    return new SamsungMobileProduct();
  }

  @Override
  public ComputerProduct createComputerProduct() {
    return new SamsungComputerProduct();
  }

  public static class SamsungMobileProduct implements MobileProduct {

    @Override
    public void show() {
      System.out.println("SamsungMobileProduct show");
    }
  }

  public static class SamsungComputerProduct implements ComputerProduct {

    @Override
    public void show() {
      System.out.println("SamsungComputerProduct show");
    }
  }
}

客戶端

public class Client {

  public static void main(String[] args) {
    ProductFactory productFactory = new SamsungProductFactory();
    productFactory.createMobileProduct().show();
    productFactory.createComputerProduct().show();
  }

}

定義兩組產品,華為和三星,每組都有自己的手機產品和電腦產品。

抽象工廠模式在JDK中的實現

JDK中操作資料庫的介面 Connection

public interface Connection {
    //建立一個執行物件
    Statement createStatement() throws SQLException;
    //建立一個支援預編譯的執行物件
    PreparedStatement prepareStatement(String sql) throws SQLException;
    //建立一個支援儲存過程的執行物件
    CallableStatement prepareCall(String sql) throws SQLException;
}

Connection 就是抽象工廠,Statement,PreparedStatement,CallableStatement 就是抽象產品,各種資料庫實現如 MySQL 和 SQLServer 就是具體產品工廠和具體產品。

總結

優點

  1. 隔離介面和實現,很容易增加新的產品簇。

缺點

  1. 增加新的產品型別很麻煩,需要修改原有系統,甚至需要修改抽象層程式碼,從這個角度看,違背了開閉原則。
  2. 類層次容易變複雜。

本質

抽象工廠模式的本質就是選擇產品簇的實現,如果只有一種產品就會退化成工廠方法模式。

使用場景

  1. 產品的建立和使用需要解耦,有多於一個的產品簇,並且產品型別穩定,不會輕易修改,這種情況下可以使用抽象工廠模式。

參考

大戰設計模式【6】—— 抽象工廠模式
大戰設計模式(第二季)【1】———— 從原始碼看工廠模式
設計模式的征途—4.抽象工廠(Abstract Factory)模式
研磨設計模式-書籍