領域驅動設計(DDD)【10】之DDD戰術模式:工廠模式與表意接口模式

文章目錄

  • 引言:DDD戰術模式的重要性
  • 一、DDD中的工廠模式
    • 1.1 工廠模式的核心概念
    • 1.2 工廠模式的三種實現方式
      • 1.2.1 簡單工廠方法
      • 1.2.2 工廠類
      • 1.2.3 抽象工廠模式
    • 1.3 工廠模式的適用場景
    • 1.4 實際案例:電商訂單系統
  • 二、表意接口模式
    • 2.1 表意接口
    • 2.2 表意接口的實現要點
      • 2.2.1 命名規范
      • 2.2.2 方法設計
    • 2.3 表意接口的優勢
    • 2.4 實際案例:庫存管理系統
  • 三、工廠模式與表意接口的協同應用
    • 3.1 結合使用的優勢
    • 3.2 綜合案例:用戶注冊系統
    • 3.3 反模式與常見錯誤
  • 四、總結

引言:DDD戰術模式的重要性

  • 在領域驅動設計(DDD)中,戰術模式是實現領域模型的關鍵工具。今天我們將深入探討兩個核心模式:工廠模式(Factory)和表意接口(Intention-Revealing Interfaces)模式。這些模式不僅能提升代碼質量,還能使領域邏輯更加清晰明確。

一、DDD中的工廠模式

1.1 工廠模式的核心概念

工廠模式在DDD中負責封裝復雜對象的創建邏輯,其主要目的是:

  • 保持領域對象的完整性
  • 隱藏復雜的構造邏輯
  • 提供一致的創建接口
  • 避免領域模型泄露構造細節

1.2 工廠模式的三種實現方式

1.2.1 簡單工廠方法

public class Order {public static Order createOrder(Customer customer, List<OrderItem> items) {Order order = new Order();order.setCustomer(customer);order.setItems(items);order.setStatus(OrderStatus.CREATED);order.setCreatedDate(LocalDateTime.now());return order;}
}

1.2.2 工廠類

public class PaymentFactory {public Payment createCreditCardPayment(BigDecimal amount, CreditCard card) {CreditCardPayment payment = new CreditCardPayment();payment.setAmount(amount);payment.setCard(card);payment.setPaymentDate(LocalDateTime.now());return payment;}public Payment createBankTransferPayment(BigDecimal amount, BankAccount account) {// 實現細節...}
}

1.2.3 抽象工廠模式

public interface ShippingProviderFactory {ShippingProvider createDomesticProvider();ShippingProvider createInternationalProvider();
}public class FedexShippingFactory implements ShippingProviderFactory {// 具體實現...
}

1.3 工廠模式的適用場景

  1. 復雜對象構造:當對象構造涉及多個步驟或復雜邏輯時
  2. 聚合根創建:確保聚合根及其內部實體的一致性
  3. 多態對象創建:需要根據條件創建不同類型的對象
  4. 重建持久化對象:從數據庫重建領域對象時

1.4 實際案例:電商訂單系統

public class OrderFactory {public Order createOrder(Customer customer, List<Product> products, Discount discount) {// 驗證業務規則if (customer.isBlocked()) {throw new CustomerBlockedException();}// 創建訂單聚合根Order order = new Order();order.setOrderNumber(generateOrderNumber());order.setCustomer(customer);order.setStatus(OrderStatus.PENDING);// 創建訂單項List<OrderItem> items = products.stream().map(p -> createOrderItem(p, discount)).collect(Collectors.toList());order.setItems(items);// 計算總價order.calculateTotal();return order;}private OrderItem createOrderItem(Product product, Discount discount) {// 實現細節...}
}

二、表意接口模式

2.1 表意接口

表意接口(Intention-Revealing Interfaces)是指通過接口名稱和方法簽名就能清晰表達其意圖和行為的接口設計方式。其核心原則是:

  • 自描述性:無需查看實現就能理解其目的
  • 領域一致性:使用領域專家熟悉的術語
  • 行為明確:方法名準確反映其行為

2.2 表意接口的實現要點

2.2.1 命名規范

  • 不良示例:
public interface OrderService {void process(Object data);
}
  • 良好示例:
public interface OrderProcessing {OrderConfirmation placeOrder(ShoppingCart cart);void cancelOrder(OrderNumber orderNumber);OrderStatus checkOrderStatus(OrderNumber orderNumber);
}

2.2.2 方法設計

  • 不良示例:
public class Account {public void update(BigDecimal amount) {// 實現細節...}
}
  • 良好示例:
public class BankAccount {public void deposit(Money amount) {// 存款操作}public void withdraw(Money amount) throws InsufficientFundsException {// 取款操作}public void transfer(Money amount, BankAccount target) {// 轉賬操作}
}

2.3 表意接口的優勢

  1. 提高代碼可讀性:減少理解代碼所需的時間
  2. 降低認知負荷:開發者可以快速理解領域邏輯
  3. 減少文檔依賴:代碼自身就是最好的文檔
  4. 促進統一語言:強化團隊對領域術語的使用

2.4 實際案例:庫存管理系統

  • 不良設計:
public class Inventory {public void adjust(int id, int qty) {// 實現細節...}
}
  • 表意接口設計:
public class InventoryManagement {public StockLevel receiveStock(ProductId product, Quantity quantity) {// 入庫操作}public StockLevel reserveStock(ProductId product, Quantity quantity) throws OutOfStockException {// 預留庫存}public void fulfillReservation(ReservationId reservation) {// 完成預留}public StockReport generateStockReport(ProductCategory category) {// 生成庫存報告}
}

三、工廠模式與表意接口的協同應用

3.1 結合使用的優勢

  • 當工廠模式與表意接口結合使用時,可以產生更強大的效果:
  1. 清晰的創建語義:工廠方法名明確表達創建意圖
  2. 一致的構造約束:通過工廠確保對象始終有效
  3. 簡化的客戶端代碼:調用方只需關注"做什么"而非"怎么做"

3.2 綜合案例:用戶注冊系統

public interface UserRegistration {User registerNewCustomer(CustomerRegistrationForm form);User registerAdminUser(AdminRegistrationRequest request);User inviteTeamMember(TeamMemberInvitation invitation);
}public class UserFactoryImpl implements UserRegistration {public User registerNewCustomer(CustomerRegistrationForm form) {// 驗證表單數據validateRegistrationForm(form);// 創建用戶聚合User user = new User();user.setUsername(form.getEmail());user.setPassword(encryptPassword(form.getPassword()));user.setRoles(Set.of(Role.CUSTOMER));user.setStatus(UserStatus.ACTIVE);// 創建客戶實體Customer customer = new Customer();customer.setUser(user);customer.setPersonalDetails(form.getPersonalDetails());user.setCustomerProfile(customer);return user;}// 其他方法實現...
}

3.3 反模式與常見錯誤

  1. 通用工廠:避免創建過于通用的工廠接口

    // 不良設計
    public interface GenericFactory {Object create(String type);
    }
    
  2. 模糊命名:工廠方法名應明確表達創建的對象的類型和意圖

    // 不良設計
    public class PaymentCreator {public Payment make(String type) {// 實現細節...}
    }// 良好設計
    public class PaymentMethodFactory {public CreditCardPayment createCreditCardPayment(CardDetails card) {// 實現細節...}
    }
    
  3. 泄露實現細節:接口不應暴露內部實現機制

    // 不良設計
    public interface OrderService {void saveToDatabase(Order order);
    }// 良好設計
    public interface OrderRepository {void save(Order order);
    }
    

四、總結

  • 工廠模式和表意接口模式是DDD戰術設計中相輔相成的兩個重要模式。工廠模式通過封裝對象創建邏輯來保證領域對象的完整性和一致性,而表意接口模式則通過清晰的命名和設計使領域意圖更加明確。

在實際應用中,我們應該:

  1. 為復雜對象創建專門的工廠,特別是聚合根
  2. 使用領域術語命名工廠方法和接口
  3. 確保接口名稱準確反映其行為和意圖
  4. 通過工廠執行必要的業務規則驗證
  5. 保持接口的簡潔性和專注性

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

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

相關文章

鴻蒙ArkTS---登錄邏輯,數據持久化,ArkUI,網絡請求等基礎內容記錄

該內容是在【博學谷】學習過程中的代碼記錄&#xff0c;如有任何問題請與作者聯系。 也歡迎同在學習鴻蒙開發的小伙伴的留言&#xff0c;一同學習&#xff0c;一同進步。 功能實現&#xff08;只記錄代碼&#xff0c;沒有相關配置&#xff0c;跑不起來&#xff09;&#xff…

沒有公網ip可以實現跨網p2p互通嗎?內網讓公網直連訪問常用工具

沒有公網IP的情況下仍然可以實現P2P通信&#xff0c;但需要借助NAT穿透技術或類似nat123同端口映射等第三方工具實現內網穿透?。???? 一、什么是P2P通信&#xff1f; P2P網絡&#xff08;Peer-to-Peer Network&#xff09;是一種去中心化的網絡架構&#xff0c;其中每個…

云服務器安裝寶塔面板(BT Panel)

安裝寶塔面板&#xff08;BT Panel&#xff09;是很多服務器管理員常用的操作&#xff0c;尤其適合用于管理網站、數據庫、FTP等。以下是基于 Linux 系統&#xff08;推薦 CentOS 或 Ubuntu&#xff09;的寶塔面板安裝步驟。 安裝前準備 云服務器一臺 可以訂購服務器 海外云主…

mongoose解析http字段值

最近在使用mongoose開發嵌入式web后端時&#xff0c;會遇到要解析js前端發送過來的http消息&#xff0c;比如傳遞用戶名&#xff0c;密碼過來&#xff0c;后端要解析出來并判斷是否登錄成功。 前端http有兩種組裝字段的方式。 第一種是 $.ajax({url: /upgradePackage,method: P…

高德地圖地址解析獲取經緯度失敗原因JSAPI

高德地圖地址解析獲取經緯度失敗原因JSAPI 地圖加載的時候老是報異常碼&#xff0c;地圖是可以加載出來的&#xff0c;但是在地圖上的操作老是有異常碼&#xff0c;找了好久不知道什么問題&#xff0c;異常碼會報兩種&#xff0c;一種是說什么key的問題&#xff0c;但是我當時…

極速JavaScript:全面性能優化實戰指南

在現代Web開發中&#xff0c;JavaScript性能直接影響用戶體驗。一個優化良好的應用能帶來更流暢的交互、更快的加載速度和更低的資源消耗。本文將深入探討實用的JavaScript性能優化技術&#xff0c;幫助您打造高性能Web應用。 一、性能瓶頸分析與診斷工具 性能問題的常見來源&…

【開源模型】高考數學139分!小米MiMo開源模型:7B參數突出重圍

小米 MiMo&#xff1a;7 B 參數撬動推理巔峰&#xff0c;開源模型的技術突圍 70 億參數超越 320 億對手&#xff0c;高考數學 139 分的背后是訓練策略的全面革新。 2025 年 4 月 30 日&#xff0c;小米開源的首個推理大模型 Xiaomi MiMo-7 B 橫空出世&#xff0c;以??僅 7 B …

用vscode破解最新typora1.10.8

1.下載格式化插件防止打開文件一團亂 1&#xff09;下載vscode&#xff1a; Download Visual Studio Code - Mac, Linux, Windows 2&#xff09;vscode下載中文插件重啟 如果沒變中文&#xff0c;在vscode界面按下&#xff1a; ctrl shift p 調出命令行 再輸入&#xff…

在 CI/CD 流程中使用 Jenkins 與 Docker 集成

在 CI/CD 流程中&#xff0c;Jenkins 與 Docker 的集成可以實現自動構建、測試、打包、發布容器鏡像&#xff0c;并部署到測試/生產環境。下面是從概念到落地操作的完整集成方案。 一、常見的集成方式有哪些&#xff1f; 方式描述1?? Jenkins 主機安裝 DockerJenkins 可以直…

閑庭信步使用SV搭建圖像測試平臺:第十課——繼續說說類

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊top_tb.bat文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程…

如何改進復雜推理 - 從提示詞設計入手

引言&#xff08;動機&#xff09; 在使用大語言模型&#xff08;如 GPT-4、Claude、DeepSeek 等&#xff09;構建智能問答、輔助決策或復雜任務代理系統時&#xff0c;可能遇到這些問題&#xff1a; 模型回答跳步驟、思路混亂同樣問題&#xff0c;模型表現高度不穩定新任務一…

如何解決和各個經銷商不同軟件對接的問題?湯臣案例分享

一、項目背景 湯臣倍健作為健康產品行業的領軍企業&#xff0c;其營銷云系統與全國經銷商 ERP 系統的數據無縫對接&#xff0c;對于提升業務運營效率和營銷精準度至關重要。傳統數據集成方法在面對經銷商 ERP 系統的多樣性和復雜性時&#xff0c;暴露出諸多問題&#xff0c;如…

Wordvice AI:Wordvice 推出的免費,基于先進的 AI 技術幫助用戶提升英文寫作質量

Wordvice AI&#xff1a;智能寫作助手&#xff0c;助力高效英文寫作 在當今全球化時代&#xff0c;英文寫作已成為眾多學生、研究人員、職場人士必備技能。然而&#xff0c;語法錯誤、表達不流暢、詞匯匱乏等問題常困擾著大家。別擔心&#xff0c;今天就來給大家介紹一款強大的…

【UE5】如何開發安卓項目的udp客戶端

1關于如何打包安卓項目這里就不贅述了 2代碼舉例。最重要的就是這兩句 #if PLATFORM_ANDROID #endif#if PLATFORM_WINDOWS #endif全部代碼如下&#xff1a; Button_Sheng.h: // Fill out your copyright notice in the Description page of Project Settings.#pragma once#in…

2025年6月21和22日復習和預習(python)

一、作業內容 &#xff08;一&#xff09;知識點回顧 用戶輸入處理 使用input()函數獲取用戶輸入的字符串&#xff0c;并存儲到變量中。 條件判斷語句 if-elif-else結構&#xff1a;根據不同條件執行相應代碼塊&#xff0c;適用于多分支判斷。 語音合成技術 導入pyttsx3庫實現…

Vue 樣式穿透語法大全(涵蓋 Vue2、Vue3、Less、Scss 等)

1. 什么是樣式穿透&#xff1f; 樣式穿透是在使用 Vue 組件時&#xff0c;為了修改子組件或第三方組件的樣式而使用的一種特殊語法。當我們使用 scoped 樣式時&#xff0c;由于樣式被限制在當前組件內&#xff0c;要修改子組件的樣式就需要使用樣式穿透。 2. 為什么需要樣式穿…

Python 屬性查找:深入理解__getattribute__與__getattr__

目錄 一、__getattribute__方法詳解 1.1 基本概念 1.2 示例分析 1.3 注意事項 二、__getattr__方法詳解 2.1 基本概念 2.2 示例分析 2.3 注意事項 三、__getattribute__與__getattr__的區別對比 3.1 調用時機 3.2 應用場景 3.3 性能影響 四、屬性查找順序 屬性查找…

打表法從原理到實戰詳解

打表法結合經典案例從原理到實戰詳解 一、打表法基本信息1.1 打表法定義1.2 打表法適用場景1.3 打表法的優缺點 二、打表法經典案例解析2.1 快速計算斐波那契數列2.1.1 問題描述2.1.2 打表思路2.1.3 Java代碼實現2.1.4 復雜度分析 2.2 快速判斷質數&#xff08;埃氏篩法結合打表…

(LeetCode 面試經典 150 題 )121. 買賣股票的最佳時機 (遍歷)

題目&#xff1a;121. 買賣股票的最佳時機 思路&#xff1a;遍歷&#xff0c;維護已遍歷過的元素中的最小值&#xff0c;時間復雜度0(n)。 C版本&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int mnprices[0];int mx0;for(int i1;i&…

(洛谷)P4447 [AHOI2018初中組] 分組

題目描述 小可可的學校信息組總共有 n 個隊員&#xff0c;每個人都有一個實力值 ai?。現在&#xff0c;一年一度的編程大賽就要到了&#xff0c;小可可的學校獲得了若干個參賽名額&#xff0c;教練決定把學校信息組的 n 個隊員分成若干個小組去參加這場比賽。 但是每個隊員都…