首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 設計模式教學:Simple Factory 簡單工廠模式原理與實戰應用

     編輯:Java 相關知識

一、簡單工廠模式核心概念

簡單工廠模式,又稱靜態工廠方法模式,屬於創建型模式。核心思想:由一個工廠類根據傳入參數決定建立哪種具體產品實例。

結構角色

角色說明
Factory (工廠)核心類,提供靜態建立方法,對外暴露建立介面
Product (抽象產品)介面或抽象類,定義產品規範
ConcreteProduct (具體產品)實作 Product 介面,工廠實際建立的類別

代碼模板

public class Factory {
    public static Product createProduct(String type) {
        if ("A".equals(type)) return new ConcreteProductA();
        if ("B".equals(type)) return new ConcreteProductB();
        throw new IllegalArgumentException("Unknown type: " + type);
    }
}

public interface Product { void use(); }

public class ConcreteProductA implements Product {
    public void use() { System.out.println("使用產品 A"); }
}

public class ConcreteProductB implements Product {
    public void use() { System.out.println("使用產品 B"); }
}

二、實戰應用:Servlet 分發器重構

問題場景:傳統 Servlet if-else 分發

protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
    String flag = req.getParameter("flag");
    if ("service1".equals(flag)) service1();
    else if ("service2".equals(flag)) service2();
    else if ("service3".equals(flag)) service3();
    // ... 膨脹難維護
}

重構:引入簡單工廠

@WebFilter("/api/*")
public class DispatchFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
        HttpServletRequest httpReq = (HttpServletRequest) req;
        String servletName = httpReq.getRequestURI().split("/")[2]; // /api/servletName
        
        Servlet servlet = ServletFactory.createServlet(servletName);
        servlet.service(req, resp); // 統一入口
    }
}

public class ServletFactory {
    public static Servlet createServlet(String name) {
        switch (name) {
            case "user": return new UserServlet();
            case "order": return new OrderServlet();
            case "product": return new ProductServlet();
            default: throw new ServletException("No such servlet: " + name);
        }
    }
}

優勢

  • Servlet 專注業務邏輯,分發邏輯集中在 Factory
  • 新增功能只需新增 Servlet + Factory 一行 case,符合開閉原則
  • 避免 web.xml 大量 `` `` 配置

三、JDK 內建簡單工廠實例

  • Calendar.getInstance() → 根據 Locale 返回 GregorianCalendar 等
  • NumberFormat.getInstance() → 返回 DecimalFormat 等
  • DriverManager.getConnection() → 根據 URL 返回具體 JDBC Driver 連線
  • ExecutorService.newFixedThreadPool() → 返回 ThreadPoolExecutor

四、總結與局限

優點缺點
建立邏輯集中,客戶端解耦具體類工廠類集中所有建立邏輯,違反單一職責,類別膨脹
新增產品只修改工廠,符合開閉原則靜態方法難以繼承覆寫,擴展性受限
程式碼簡潔,易理解不支援複雜建立邏輯(需參數驗證、依賴注入等)

💡 進階替代:工廠方法模式、抽象工廠模式、Spring IoC 容器(終極工廠)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved