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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
James Wang
July 03, 2019
Programming
430
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
0
64
實踐 BizDevOps 在遺留系統中的挑戰與策略
jame2408
0
520
DDD 中的橋樑:透過有效建模與設計從戰略走向戰術
jame2408
0
580
從領域知識到架構設計
jame2408
1
300
淺談領域驅動設計
jame2408
1
620
淺談自動化測試
jame2408
0
350
Domain Driven Design The First 15 Years 導讀分享
jame2408
0
440
Domain Storytelling 領域敘事 - 簡介圖示語言
jame2408
2
2.8k
領域驅動設計戰略篇
jame2408
0
740
Other Decks in Programming
See All in Programming
Oxlintのカスタムルールの現況
syumai
6
1.1k
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
A2UI という光を覗いてみる
satohjohn
1
140
OSもどきOS
arkw
0
560
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
240
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
110
Inside Stream API
skrb
1
710
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
160
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
760
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
690
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
330
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
140
Featured
See All Featured
Design in an AI World
tapps
1
240
Paper Plane
katiecoart
PRO
1
51k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Between Models and Reality
mayunak
4
340
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
250
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
Building Applications with DynamoDB
mza
96
7.1k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
How to Think Like a Performance Engineer
csswizardry
28
2.7k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
730
My Coaching Mixtape
mlcsv
0
150
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 狀態的正確性。 • 使用工廠之前,先確認所謂的複雜是不是設計不良引起的。有些情況下只需要使 用建構子。 • 工廠是放置固定規則相關邏輯的合適地方。 • 透過工廠封裝,表達限界上下文的通用語言。