Java 工廠設計模式詳解:用統一入口打造靈活可擴展的登錄系統----掌握 Spring 源碼的基礎第一步

一、前言

在實際開發中,我們經常面臨以下場景:

  • 系統支持多種登錄方式(用戶名密碼、管理員登錄、OAuth 登錄、短信登錄等)

  • 每種登錄方式的認證邏輯不同

  • 我們希望對外提供一個統一的接口調用,而不暴露具體實現

這個時候,工廠設計模式(Factory Pattern)就是解決這種需求的最佳利器。

在本文中,我們通過一個模擬登錄系統的實際案例,帶你深入理解工廠模式的結構、優點和應用場景。

二、什么是工廠模式?

工廠模式是一種創建型設計模式,它通過定義一個用于創建對象的接口,讓子類決定實例化哪一個類。這樣,我們可以將對象的創建與使用解耦,實現更強的擴展性和可維護性。

通俗地說,工廠模式就像點外賣平臺——你只管下單(告訴工廠你想吃什么),工廠幫你創建對應的“菜品實例”,你不需要關心這些菜是怎么做的。

三、代碼結構總覽

我們使用一個模擬登錄系統的例子,分別支持:

  • 普通用戶登錄(用戶名 + 密碼)

  • 管理員登錄

  • 第三方 OAuth 登錄

結構如下:

com.Factory_Pattern
├── LoginService.java         // 抽象接口
├── UserLoginService.java     // 普通用戶登錄實現
├── AdminLoginService.java    // 管理員登錄實現
├── OAuthLoginService.java    // OAuth 登錄實現
├── LoginFactory.java         // 工廠類
└── Test.java                 // 測試入口

四、核心代碼詳解

1. 定義統一接口:LoginService

public interface LoginService {boolean login(String username, String credential);
}

所有登錄服務都必須實現這個接口,保證調用方使用統一的方式調用。

2. 三種登錄實現類

public class UserLoginService implements LoginService {@Overridepublic boolean login(String username, String password) {System.out.println("普通用戶登錄驗證中...");return "user".equals(username) && "123".equals(password);}
}
public class AdminLoginService implements LoginService {@Overridepublic boolean login(String username, String password) {System.out.println("管理員登錄驗證中...");return "admin".equals(username) && "adminpass".equals(password);}
}
public class OAuthLoginService implements LoginService {@Overridepublic boolean login(String username, String token) {System.out.println("OAuth 登錄驗證中...");return "oauth_token".equals(token);}
}

每個實現類各自處理自己的登錄邏輯,互不干擾,職責單一。

3. 工廠類 LoginFactory

public class LoginFactory {public static LoginService getLoginService(String userType) {switch (userType.toLowerCase()) {case "user":return new UserLoginService();case "admin":return new AdminLoginService();case "oauth":return new OAuthLoginService();default:throw new IllegalArgumentException("未知用戶類型: " + userType);}}
}

這個工廠類根據 userType 動態創建不同的登錄對象。調用方無需知道這些類的具體細節,只要提供一個標識即可。

4. 客戶端使用(Test 類)

這個客戶端代碼從頭到尾都沒有出現任何具體子類的名字,只跟接口 LoginService 打交道,完美體現了解耦。

public class Test {public static void main(String[] args) {String userType = "oauth";String username = "admin";String token = "oauth_token";LoginService loginService = LoginFactory.getLoginService(userType);boolean success = loginService.login(username, token);System.out.println(success ? "登錄成功!" : "登錄失敗!");}
}

這個客戶端代碼從頭到尾都沒有出現任何具體子類的名字,只跟接口 LoginService 打交道,完美體現了解耦。

五、工廠模式進階建議

在實際項目中,工廠模式可以結合以下設計理念使用:

  • 策略模式:工廠只負責創建對象,具體邏輯交給策略執行

  • 配置驅動工廠:通過配置文件動態注入類名,支持熱插拔

  • 反射 + 注冊表:消除 switch 分支,提升擴展性

如果你想進一步封裝登錄邏輯,可以使用策略 + 工廠模式組合,寫成:

LoginStrategy strategy = LoginStrategyFactory.get(userType);
strategy.authenticate(request);

?完整代碼:
?

package com.Factory_Pattern;import java.util.HashMap;
import java.util.Map;public class Final {public static void main(String[] args) {String userType = "oauth";String username = "admin";String credential = "oauth_token";LoginStrategy strategy = LoginStrategyFactory.getStrategy(userType);boolean success = strategy.login(username, credential);System.out.println(success ? "? 登錄成功!" : "? 登錄失敗!");}
}interface LoginStrategy {boolean login(String username, String credential);
}class UserLoginStrategy implements LoginStrategy {@Overridepublic boolean login(String username, String password) {System.out.println("【普通用戶】登錄驗證...");return "user".equals(username) && "123".equals(password);}
}class AdminLoginStrategy implements LoginStrategy {@Overridepublic boolean login(String username, String password) {System.out.println("【管理員】登錄驗證...");return "admin".equals(username) && "adminpass".equals(password);}
}class OAuthLoginStrategy implements LoginStrategy {@Overridepublic boolean login(String username, String token) {System.out.println("【OAuth】登錄驗證...");return "oauth_token".equals(token);}
}class LoginStrategyFactory {private static final Map<String, LoginStrategy> STRATEGY_MAP = new HashMap<>();static {STRATEGY_MAP.put("user", new UserLoginStrategy());STRATEGY_MAP.put("admin", new AdminLoginStrategy());STRATEGY_MAP.put("oauth", new OAuthLoginStrategy());}public static LoginStrategy getStrategy(String userType) {LoginStrategy strategy = STRATEGY_MAP.get(userType.toLowerCase());if (strategy == null) {throw new IllegalArgumentException("未知用戶類型: " + userType);}return strategy;}
}

六、結語

工廠模式作為 Java 最常用的設計模式之一,真正的精髓在于解耦與擴展性。尤其在業務不斷演進、需求不斷變化的環境中,工廠模式提供了一種優雅的應對方式。學會了工廠模式,你將能更從容地面對對象創建、邏輯分發和模塊擴展等挑戰。如果你覺得本文對你有幫助,歡迎點贊、評論和分享,讓更多人了解并掌握設計模式的魅力!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77265.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77265.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77265.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows Acrobat Pro DC-v2025.001.20435-x64-CN-Portable便攜版

Windows Acrobat Pro 鏈接&#xff1a;https://pan.xunlei.com/s/VOO1nMjQ1Qf53dyISGne0c_9A1?pwdsfgn# Acrobat Pro 2024 專業增強版特色 ● 創建和編輯 PDF 文件&#xff1a;可以將各種類型的文檔轉換為 PDF 格式&#xff0c;并進行編輯和修改。 ● 合并和拆分 PDF&#…

【2025“華中杯”大學生數學建模挑戰賽】C題:就業狀態分析與預測 詳細解題思路

目錄 2025“華中杯”大學生數學建模挑戰賽C題 詳細解題思路一、問題一1.1 問題分析1.2 數學模型 1.3 Python代碼1.4 Matlab代碼 二、問題二2.1 問題分析2.2 數學模型 2.3 Python代碼2.4 Matlab代碼 三、問題三3.1 問題分析 四、問題四4.1 問題分析與數學模型 2025“華中杯”大學…

識別法院PDF文件特定字段并插入數據庫【正則表達式+本地化部署】

pdf解析法院協助單特定字段&#xff0c;開源項目&#xff0c;結合若依項目進行開發&#xff0c;不連互聯網&#xff0c;本地開發部署&#xff0c;前端使用vue3技術,后端用若依分離版spring botot技術&#xff0c;實現將pdf法院協助執行通知書中的特定字段如&#xff1a;時間、文…

擁抱健康養生,開啟活力生活

在快節奏的現代生活中&#xff0c;人們愈發重視健康養生。它并非高深莫測的學問&#xff0c;而是融合于日常點滴&#xff0c;對我們的生活有著深遠影響。 合理飲食是健康養生的基石。一日三餐&#xff0c;應遵循營養均衡原則。多攝入蔬菜、水果&#xff0c;它們富含維生素與膳食…

無人機姿態穩定與動態控制模塊概述!

一、設計難點 1. 動態算力需求與硬件能力的不匹配** 無人機邊緣計算設備通常受限于體積和重量&#xff0c;導致其計算單元&#xff08;如CPU、GPU&#xff09;的算力有限&#xff0c;難以應對突發的高負載任務&#xff08;如實時圖像處理、AI推理&#xff09;。 挑戰&am…

MySQL 臨時表介紹

在 MySQL 數據庫中&#xff0c;臨時表是一種特殊類型的表&#xff0c;它在數據庫會話期間存在&#xff0c;會話結束時自動刪除。臨時表為處理特定的、臨時性的數據操作任務提供了一種高效且便捷的方式。 一、臨時表的創建 使用CREATE TEMPORARY TABLE語句來創建臨時表。其語法…

量子糾纏物理本質、技術實現、應用場景及前沿研究

以下是關于 量子糾纏(Quantum Entanglement) 的深度解析,涵蓋物理本質、技術實現、應用場景及前沿研究,以技術視角展開: 一、量子糾纏的物理本質 1. 核心定義 量子糾纏是多個量子系統(如粒子)間的一種關聯狀態,表現為: 非局域性:糾纏態粒子無論相距多遠,測量其中一…

掃雷-C語言版

C語言掃雷游戲設計&#xff08;完整版&#xff09; 游戲背景 掃雷是一款經典的益智類單人電腦游戲&#xff0c;最早出現在1960年代&#xff0c;并在1990年代隨著Windows操作系統而廣為人知。游戲目標是在不觸發任何地雷的情況下&#xff0c;揭開所有非地雷的格子。玩家需要根…

深入理解 Linux 權限管理:從 Shell 到文件權限

&#x1f33c;&#x1f33c; 在 Linux 系統中&#xff0c;權限是保障系統安全與穩定的核心之一。每個操作都可能涉及權限的管理和控制&#xff0c;特別是當你開始以不同用戶的身份進行操作時。本文將通過生動的比喻與詳細的技術解析&#xff0c;帶你一起深入理解 Linux 權限系統…

【Java面試系列】Spring Cloud微服務架構中的分布式事務解決方案與Seata框架實現原理詳解 - 3-5年Java開發必備知識

【Java面試系列】Spring Cloud微服務架構中的分布式事務解決方案與Seata框架實現原理詳解 - 3-5年Java開發必備知識 引言 在微服務架構中&#xff0c;分布式事務是一個不可避免的挑戰。隨著業務復雜度的提升&#xff0c;如何保證跨服務的數據一致性成為了面試中的高頻問題。本…

【c語言】——深入理解指針2

文章目錄 一、指針數組指針數組模擬二維數組 二、數組指針二維數組傳參的本質 三、字符指針變量四、函數指針變量4.1. 函數指針的應用4.2 兩端有趣的代碼4.3. typedef關鍵字4.3.1 typedef 的使用4.3.2. typedef與#define對比 五、函數指針數組函數指針數組的應用 一、指針數組 …

python20-while和for in的美

課程&#xff1a;B站大學 記錄python學習&#xff0c;直到學會基本的爬蟲&#xff0c;使用python搭建接口自動化測試就算學會了&#xff0c;在進階webui自動化&#xff0c;app自動化 分支語句那些事兒 循環的類型循環的作用循環的構成要素while 循環while 循環實戰循環語句 for…

私人筆記:動手學大模型應用開發llm-universe項目環境創建

項目代碼&#xff1a;datawhalechina/llm-universe: 本項目是一個面向小白開發者的大模型應用開發教程&#xff0c;在線閱讀地址&#xff1a;https://datawhalechina.github.io/llm-universe/ 項目書&#xff1a;動手學大模型應用開發 一、初始化項目 uv init llm-universe-te…

剖析 Rust 與 C++:性能、安全及實踐對比

1 性能對比&#xff1a;底層控制與運行時開銷 1.1 C 的性能優勢 C 給予開發者極高的底層控制能力&#xff0c;允許直接操作內存、使用指針進行精細的資源管理。這使得 C 在對性能要求極高的場景下&#xff0c;如游戲引擎開發、實時系統等&#xff0c;能夠發揮出極致的性能。以…

詳細講解一下Java中的Enum

Java 中的 枚舉&#xff08;Enum&#xff09; 是一種特殊的類&#xff0c;用于表示一組固定且有限的常量&#xff08;如狀態、類型、選項等&#xff09;。它提供類型安全的常量定義&#xff0c;比傳統的常量&#xff08;如 public static final&#xff09;更強大和靈活。以下是…

首席人工智能官(Chief Artificial Intelligence Officer,CAIO)的詳細解析

以下是**首席人工智能官&#xff08;Chief Artificial Intelligence Officer&#xff0c;CAIO&#xff09;**的詳細解析&#xff1a; 1. 職責與核心職能 制定AI戰略 制定公司AI技術的長期戰略&#xff0c;明確AI在業務中的應用場景和優先級&#xff0c;推動AI與核心業務的深度…

LeetCode【劍指offer】系列(位運算篇)

劍指offer15.二進制中1的個數 題目鏈接 題目&#xff1a;編寫一個函數&#xff0c;輸入是一個無符號整數&#xff08;以二進制串的形式&#xff09;&#xff0c;返回其二進制表達式中數字位數為 ‘1’ 的個數&#xff08;也被稱為 漢明重量).&#xff09;。 思路一&#xff…

前端路由緩存實現

場景&#xff1a;以一體化為例&#xff1a;目前頁面涉及頁簽和大量菜單路由&#xff0c;用戶想要實現頁面緩存&#xff0c;即列表頁、詳情頁甚至是編輯彈框頁都要實現數據緩存。 方案&#xff1a;使用router-view的keep-alive實現 。 一、實現思路 1.需求梳理 需要緩存模塊&…

Buildroot編譯過程中下載源碼失敗

RK3588編譯編譯一下recovery&#xff0c;需要把buildroot源碼編譯一遍。遇到好幾個文件都下載失敗&#xff0c;如下所示 pm-utils 1.4.1這個包下載失敗&#xff0c;下載地址http://pm-utils.freedesktop.org/releases 解決辦法&#xff0c;換個網絡用windows瀏覽器下載后&…

Operator 開發入門系列(一):Hello World

背景 我們公司最近計劃將產品遷移到 Kubernetes 環境。 為了更好地管理和自動化我們的應用程序&#xff0c;我們決定使用 Kubernetes Operator。 本系列博客將記錄我們學習和開發 Operator 的過程&#xff0c;希望能幫助更多的人入門 Operator 開發。 目標讀者 對 Kubernete…