構建基於Kafka中轉的混合雲線上資料同步-CloudCanal實戰
阿新 • • 發佈:2021-08-06
定義
提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。
結構
- 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 就是具體產品工廠和具體產品。
總結
優點
- 隔離介面和實現,很容易增加新的產品簇。
缺點
- 增加新的產品型別很麻煩,需要修改原有系統,甚至需要修改抽象層程式碼,從這個角度看,違背了開閉原則。
- 類層次容易變複雜。
本質
抽象工廠模式的本質就是選擇產品簇的實現,如果只有一種產品就會退化成工廠方法模式。
使用場景
- 產品的建立和使用需要解耦,有多於一個的產品簇,並且產品型別穩定,不會輕易修改,這種情況下可以使用抽象工廠模式。
參考
大戰設計模式【6】—— 抽象工廠模式
大戰設計模式(第二季)【1】———— 從原始碼看工廠模式
設計模式的征途—4.抽象工廠(Abstract Factory)模式
研磨設計模式-書籍