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就是建立物件的工廠介面,SedanFactory
和SUVFactory
是其子類,它們分別決定例項化Sedan
和SUV
類。這樣如果要新增新型別的汽車,只需要建立新的汽車類和對應的工廠類,而不需要修改現在的程式碼,符合開閉原則。
然後就是關於工廠模式的實際應用
資料庫連線池:
-
比如
HikariCP
、C3P0
、Druid
等常見的連線池實現,它們都會使用工廠模式來建立和配置資料庫連線池物件。通常,連線池會暴露一個工廠類,透過工廠方法提供資料庫連線物件,而使用者不需要直接建立資料庫連線物件,而是從連線池中獲取。這種方式可以有效地管理資料庫連線,避免每次請求都重新建立連線。例如,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 的資料庫連線管理中及我舉的例子中都有體現
符合開閉原則,使得擴充套件性很好
缺點
增加系統複雜度:引入工廠模式會增加系統的複雜度,尤其是對於簡單的應用程式。如果系統本身不復雜,使用工廠模式可能會顯得有些過度設計,增加了額外的抽象層和類的數量。對於小型專案,簡單的物件建立邏輯不一定需要工廠模式。
可能導致類過多
難以適應頻繁變化的需求:如果應用程式需要頻繁地變化和修改物件的建立方式,工廠模式可能變得不夠靈活。在這種情況下,可能需要更為靈活的設計模式,如 抽象工廠模式 或 依賴注入。