Java設(shè)計模式-工廠模式
Java設(shè)計模式-工廠模式
關(guān)于Java的全部設(shè)計模式和分類,在單例模式中已有。
工廠模式
簡介
定義創(chuàng)建對象的接口(工廠),讓其子類決定實例化哪一個類。
場景
這里會舉兩個例子,一個自己舉的例子,一些工廠模式的實際使用場景
創(chuàng)建汽車的例子
1.產(chǎn)品接口
首先定義一個產(chǎn)品的接口,比如以創(chuàng)建汽車的例子,例如有一個Car接口:
public interface Car {
void drive();
}
2.具體產(chǎn)品類
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用于生產(chǎn)汽車:
public interface CarFactory{
Car produceCar();
}
然后有具體的類決定生產(chǎn)那種車:
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){
//使用轎車工廠生產(chǎn)轎車并啟動
SedanFactory s = new SedanFactory();
Car sedun = s.produceCar();
sedun.drive();
//同理:請你寫
}
}
在這個例子中,CarFactory就是創(chuàng)建對象的工廠接口,SedanFactory和SUVFactory是其子類,它們分別決定實例化Sedan和SUV類。這樣如果要添加新類型的汽車,只需要創(chuàng)建新的汽車類和對應(yīng)的工廠類,而不需要修改現(xiàn)在的代碼,符合開閉原則。
然后就是關(guān)于工廠模式的實際應(yīng)用
數(shù)據(jù)庫連接池:
-
比如
HikariCP、C3P0、Druid等常見的連接池實現(xiàn),它們都會使用工廠模式來創(chuàng)建和配置數(shù)據(jù)庫連接池對象。通常,連接池會暴露一個工廠類,通過工廠方法提供數(shù)據(jù)庫連接對象,而用戶不需要直接創(chuàng)建數(shù)據(jù)庫連接對象,而是從連接池中獲取。這種方式可以有效地管理數(shù)據(jù)庫連接,避免每次請求都重新創(chuàng)建連接。例如,HikariCP(一個高性能的數(shù)據(jù)庫連接池),在初始化時使用了類似工廠模式的設(shè)計:java復(fù)制代碼HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase"); dataSource.setUsername("user"); dataSource.setPassword("password");在這個過程中,
HikariDataSource實際上充當(dāng)了工廠類,用戶通過它來配置和獲取數(shù)據(jù)庫連接。
序列化與反序列化:
- 在一些框架中(如 JSON 或 XML 解析庫),工廠模式用于根據(jù)配置創(chuàng)建不同類型的對象,或者根據(jù)數(shù)據(jù)格式(JSON、XML)動態(tài)選擇適當(dāng)?shù)慕馕銎鳌?/li>
日志框架:
- 在一些日志框架(如 Log4j 或 SLF4J)中,工廠模式用于根據(jù)配置生成不同類型的日志記錄器對象。通常通過工廠方法來選擇不同的日志級別、輸出目的地等。
MyBatis中的應(yīng)用
-
在 MyBatis 中,工廠模式也有應(yīng)用,主要體現(xiàn)在數(shù)據(jù)庫連接和會話管理的部分。
SqlSessionFactory:MyBatis 的核心工廠類之一就是
SqlSessionFactory,它用于創(chuàng)建和管理SqlSession對象。SqlSessionFactory是一個典型的工廠模式實現(xiàn)。它通過讀取 MyBatis 配置文件(如mybatis-config.xml),根據(jù)配置信息來創(chuàng)建SqlSession對象。例如,以下是 MyBatis 中創(chuàng)建
SqlSessionFactory的方式:SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSessionFactory的構(gòu)建通常需要配置數(shù)據(jù)源、映射器等信息,它會根據(jù)這些配置生成SqlSession實例,而用戶則通過SqlSessionFactory獲取到SqlSession,并通過它來執(zhí)行數(shù)據(jù)庫操作。這一過程的核心就是通過工廠模式動態(tài)創(chuàng)建和管理SqlSession對象。
優(yōu)點
就結(jié)合上面的例子,理解為什么要使用它,不使用就不行嗎?
解耦對象創(chuàng)建和使用,在 MySQL 和 MyBatis 的數(shù)據(jù)庫連接管理中及我舉的例子中都有體現(xiàn)
符合開閉原則,使得擴展性很好
缺點
增加系統(tǒng)復(fù)雜度:引入工廠模式會增加系統(tǒng)的復(fù)雜度,尤其是對于簡單的應(yīng)用程序。如果系統(tǒng)本身不復(fù)雜,使用工廠模式可能會顯得有些過度設(shè)計,增加了額外的抽象層和類的數(shù)量。對于小型項目,簡單的對象創(chuàng)建邏輯不一定需要工廠模式。
可能導(dǎo)致類過多
難以適應(yīng)頻繁變化的需求:如果應(yīng)用程序需要頻繁地變化和修改對象的創(chuàng)建方式,工廠模式可能變得不夠靈活。在這種情況下,可能需要更為靈活的設(shè)計模式,如 抽象工廠模式 或 依賴注入。
本文來自博客園,作者:Liberty碼農(nóng)志,轉(zhuǎn)載請注明原文鏈接:http://www.rzrgm.cn/zhiliu/p/18571028

浙公網(wǎng)安備 33010602011771號