Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DDD TW 7th 導讀 - Ch11 Factory
Search
James Wang
July 03, 2019
Programming
450
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
DDD TW 7th 導讀 - Ch11 Factory
James Wang
July 03, 2019
More Decks by James Wang
See All by James Wang
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.4k
AI 寫得更快,你真的懂嗎?
jame2408
0
290
實踐 BizDevOps 在遺留系統中的挑戰與策略
jame2408
0
550
DDD 中的橋樑:透過有效建模與設計從戰略走向戰術
jame2408
0
600
從領域知識到架構設計
jame2408
1
340
淺談領域驅動設計
jame2408
1
650
淺談自動化測試
jame2408
0
380
Domain Driven Design The First 15 Years 導讀分享
jame2408
0
450
Domain Storytelling 領域敘事 - 簡介圖示語言
jame2408
2
2.8k
Other Decks in Programming
See All in Programming
初めての模倣学習とVLA
natsutan
0
250
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
380
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
620
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
190
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
210
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
580
仕様駆動開発の消費期限
watany
20
9k
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
720
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
300
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
3
1.9k
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
2
210
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.7k
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Designing for humans not robots
tammielis
254
26k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
950
Side Projects
sachag
455
43k
Google's AI Overviews - The New Search
badams
0
1.1k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
820
A better future with KSS
kneath
240
18k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
500
Why Our Code Smells
bkeepers
PRO
340
58k
Technical Leadership for Architectural Decision Making
baasie
3
530
A Soul's Torment
seathinner
6
3.5k
A Tale of Four Properties
chriscoyier
163
24k
Transcript
Factory in DDD 2019/07/03 DDD TW James Wang
大家知道工廠模式嗎? (知道的話今天導讀就到這邊了)
工廠模式 1. 很多變形:Abstract Factory、Factory Method、Builder…… 2. 透過封裝內部結構,簡化 Client 端「建立」和「重建」複雜物件流程。 Client
FACTORY Product new create product
在 DDD 中,該如何運用工廠模式?
Factory in DDD 當建立一個物件或建立整個 Aggregate 時,如果建立的工作很複雜,或者暴露過多的 內部結構,則可以使用 Factory 進行封裝。 使用動機:
• 將建立複雜物件的實例和 Aggregate 的職責轉移給單獨的物件。 • 封裝建立 Aggregate 時所有職責,譬如創建物件時的檢核。舉例來說,建立「狗」 的物件,傳入屬性「狗腿」個數,則需檢核「狗腿」不能大於 4 條腿。 • 透過工廠,建立 Aggregate 時要把它作為一個整體,並確保它滿足固定規則。
Aggregate Root 中的 Factory • 最常見的運用之一。 • 主要職責是一口氣將該 Aggregate Root
底下所有 Aggregate 建立起來。 • 也負責建立 Aggregate 所需邏輯與檢核。
一般的寫法 建構式中做完初始化所有功能。 public class Order : EntityBase, IAggregateRoot { public
decimal Total { get; private set; } public Order(Guid id, IEnumerable<Product> orderItems) : base(id) { // 針對 Products 檢核(略) // 計算總金額 var total = 0m; foreach (var item in orderItems) { if (item.UnitPrice > 0) { total += item.UnitPrice; } else { throw new ArgumentOutOfRangeException(nameof(item.UnitPrice)); } } Total = total; } }
套用工廠寫法 透過工廠呼叫 Aggregate Root。 public class OrderFactory { public Order
Create(Guid id, IEnumerable<Product> orderItems) { // 針對 Products 檢核(略) // 計算總金額(略) return new Order(id, orderItems); } }
套用工廠寫法 另外一種寫法。 public class Order : EntityBase, IAggregateRoot { public
List<Product> OrderItems { get; } = new List<Product>(); private Order(Guid id) : base(id) { } public static Order NewOrder(Guid id) { return new Order(id); } public void Create(IEnumerable<Product> orderItems) { // 針對 Products 檢核(略) // 計算總金額(略) } }
各式各樣的工廠 • Domain Service Factory • Entity Factory • Value
Object Factory 簡單說,當你發現建造物件很複雜時,都能套用工廠模式。 BUT… 有時候其實是你設計不好導致太複雜。 所以套用工廠模式前,請回頭看看自己的設計是否有沒有問題。
Recap • 當覺得建立或重建物件很複雜或想要隱藏細節的地方,都能用工廠。 • 在 DDD 中,常用於 Aggregate Root,在建立 Aggregate
時要把它視為一個整體 ,並確保它滿足固定規則,保證 Aggregate 狀態的正確性。 • 使用工廠之前,先確認所謂的複雜是不是設計不良引起的。有些情況下只需要使 用建構子。 • 工廠是放置固定規則相關邏輯的合適地方。 • 透過工廠封裝,表達限界上下文的通用語言。