Java設計模式-工廠模式

柳~發表於2024-11-26

Java設計模式-工廠模式

關於Java的全部設計模式和分類,在單例模式中已有。

工廠模式

簡介

定義建立物件的介面(工廠),讓其子類決定例項化哪一個類。

場景

這裡會舉兩個例子,一個自己舉的例子,一些工廠模式的實際使用場景

建立汽車的例子

1.產品介面

首先定義一個產品的介面,比如以建立汽車的例子,例如有一個Car介面:

public interface Car {
	void drive();
}

2.具體產品類

public class Sedan implements Car {
	@Override
	public void drive(){
		System.out.println("轎車啟動");	
	}
}

public class SUV implements Car {
    @Override
    public void drive(){
        System.out.println("SUV啟動");
    }
}

3.工廠介面和具體工廠類

定義一個工廠介面CarFactory用於生產汽車:

public interface CarFactory{
    Car produceCar();
}

然後有具體的類決定生產那種車:

public class SedanFactory implements CarFactory{
    @Override
    public Car produceCar(){
        return new Sedan();
    }
}

public class SUVFactory implements CarFactory {
    @Override
    public Car produceCar(){
        return new SUV();
    }
}

4.使用示例

public class Main{
    public static void main(String[] args){
    	//使用轎車工廠生產轎車並啟動
        SedanFactory s = new SedanFactory();
        Car sedun = s.produceCar();
        sedun.drive();
        
        //同理:請你寫
	}
}

在這個例子中,CarFactory就是建立物件的工廠介面,SedanFactorySUVFactory是其子類,它們分別決定例項化SedanSUV類。這樣如果要新增新型別的汽車,只需要建立新的汽車類和對應的工廠類,而不需要修改現在的程式碼,符合開閉原則。

然後就是關於工廠模式的實際應用

資料庫連線池

  • 比如 HikariCPC3P0Druid 等常見的連線池實現,它們都會使用工廠模式來建立和配置資料庫連線池物件。通常,連線池會暴露一個工廠類,透過工廠方法提供資料庫連線物件,而使用者不需要直接建立資料庫連線物件,而是從連線池中獲取。這種方式可以有效地管理資料庫連線,避免每次請求都重新建立連線。例如,HikariCP(一個高效能的資料庫連線池),在初始化時使用了類似工廠模式的設計:

    java複製程式碼HikariDataSource dataSource = new HikariDataSource();
    dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
    dataSource.setUsername("user");
    dataSource.setPassword("password");
    

    在這個過程中,HikariDataSource 實際上充當了工廠類,使用者透過它來配置和獲取資料庫連線。

序列化與反序列化

  • 在一些框架中(如 JSON 或 XML 解析庫),工廠模式用於根據配置建立不同型別的物件,或者根據資料格式(JSON、XML)動態選擇適當的解析器。

日誌框架

  • 在一些日誌框架(如 Log4j 或 SLF4J)中,工廠模式用於根據配置生成不同型別的日誌記錄器物件。通常透過工廠方法來選擇不同的日誌級別、輸出目的地等。

MyBatis中的應用

  • 在 MyBatis 中,工廠模式也有應用,主要體現在資料庫連線和會話管理的部分。

    SqlSessionFactory:MyBatis 的核心工廠類之一就是 SqlSessionFactory,它用於建立和管理 SqlSession 物件。SqlSessionFactory 是一個典型的工廠模式實現。它透過讀取 MyBatis 配置檔案(如 mybatis-config.xml),根據配置資訊來建立 SqlSession 物件。

    例如,以下是 MyBatis 中建立 SqlSessionFactory 的方式:

    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    

    SqlSessionFactory 的構建通常需要配置資料來源、對映器等資訊,它會根據這些配置生成 SqlSession 例項,而使用者則透過 SqlSessionFactory 獲取到 SqlSession,並透過它來執行資料庫操作。這一過程的核心就是透過工廠模式動態建立和管理 SqlSession 物件。

優點

就結合上面的例子,理解為什麼要使用它,不使用就不行嗎?

解耦物件建立和使用,在 MySQL 和 MyBatis 的資料庫連線管理中及我舉的例子中都有體現

符合開閉原則,使得擴充套件性很好

缺點

增加系統複雜度:引入工廠模式會增加系統的複雜度,尤其是對於簡單的應用程式。如果系統本身不復雜,使用工廠模式可能會顯得有些過度設計,增加了額外的抽象層和類的數量。對於小型專案,簡單的物件建立邏輯不一定需要工廠模式。

可能導致類過多

難以適應頻繁變化的需求:如果應用程式需要頻繁地變化和修改物件的建立方式,工廠模式可能變得不夠靈活。在這種情況下,可能需要更為靈活的設計模式,如 抽象工廠模式依賴注入

相關文章