需求
設計一套專案管理軟體,有三種身份的使用者能建立專案。分別是「管理員」、「已註冊顧客」、「未註冊顧客」。
原解法
在Project類別底下,實作三個靜態函式:
* createForAdmin
* createForClient
* createForGuest
分別代表三種建立專案的方法。
在建立時只要呼叫:
$project = Project::createForClient();
即可。
問題
Project類別的函式代表了「一個專案擁有的方法、屬性」,現又加入了靜態函式去代表「關於專案的一切函式」。
在Project類別還小時,這是一個快速又可接受的作法。
但當Project類別肥大起來,這增加了理解的困難(Project代表的含意太過廣泛)。
DDD觀點
負責建立domain objects的任務可以獨立成一個Factory類別。
在建立時只要呼叫:
$factory = new ProjectFactory(); $project = $factory->createForClient();
即可。