簡單工廠模式,又稱靜態工廠方法模式,屬於創建型模式。核心思想:由一個工廠類根據傳入參數決定建立哪種具體產品實例。
| 角色 | 說明 |
|---|---|
| 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"); }
}
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);
}
}
}
Calendar.getInstance() → 根據 Locale 返回 GregorianCalendar 等NumberFormat.getInstance() → 返回 DecimalFormat 等DriverManager.getConnection() → 根據 URL 返回具體 JDBC Driver 連線ExecutorService.newFixedThreadPool() → 返回 ThreadPoolExecutor| 優點 | 缺點 |
|---|---|
| 建立邏輯集中,客戶端解耦具體類 | 工廠類集中所有建立邏輯,違反單一職責,類別膨脹 |
| 新增產品只修改工廠,符合開閉原則 | 靜態方法難以繼承覆寫,擴展性受限 |
| 程式碼簡潔,易理解 | 不支援複雜建立邏輯(需參數驗證、依賴注入等) |
💡 進階替代:工廠方法模式、抽象工廠模式、Spring IoC 容器(終極工廠)