Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
DDD TW 7th 導讀 - Ch11 Factory
Search
James Wang
July 03, 2019
Programming
460
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.5k
AI 寫得更快,你真的懂嗎?
jame2408
0
300
實踐 BizDevOps 在遺留系統中的挑戰與策略
jame2408
0
550
DDD 中的橋樑:透過有效建模與設計從戰略走向戰術
jame2408
0
610
從領域知識到架構設計
jame2408
1
350
淺談領域驅動設計
jame2408
1
660
淺談自動化測試
jame2408
0
400
Domain Driven Design The First 15 Years 導讀分享
jame2408
0
460
Domain Storytelling 領域敘事 - 簡介圖示語言
jame2408
2
2.8k
Other Decks in Programming
See All in Programming
FreeBSDでZabbixを動かす.pdf
kenkino
0
280
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
120
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
110
自分的「カンファレンスの楽しみ方」
syumai
0
200
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
170
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
200
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
320
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
240
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
120
新卒PdEのリアル
ryu1013
1
500
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
7.2k
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
230
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.1k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
990
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
430
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
300
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
700
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Accessibility Awareness
sabderemane
1
210
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 狀態的正確性。 • 使用工廠之前,先確認所謂的複雜是不是設計不良引起的。有些情況下只需要使 用建構子。 • 工廠是放置固定規則相關邏輯的合適地方。 • 透過工廠封裝,表達限界上下文的通用語言。