Factory
生成過程が複雑なインスタンスの生成に責務を持つクラス.
他のオブジェクトを生成するようなコンストラクタであれば,そのオブジェクトの変化に合わせてコンストラクタも変更しなくてはならなくなるため,Factoryを利用する動機になり得る.
ただ漠然とインスタンス化するのではなく,Factoryを導入するべきか検討する習慣を身に付けるべきである.
ドメイン駆動設計入門
Domain.Models.Users.UserとDomain.Models.Users.IUserFactoryのように,同じ名前空間にFactoryを置くべきである.
Domain.Models.Users.Userだけ見てもFactoryの存在に気付きにくいため.
code:UserApplicationService.cs
public class UserApplicationService {
private readonly IUserFactory userFactory;
public void Register(UserRegisterCommand command) {
var userName = new UserName(command.Name);
// 利用側
var user = userFactory.Create(userName);
...
}
}
// 実装例 IDの振り方を実装によって自由にできる.
class InMemoryUserFactory: IUsrFactory {
private int currentId;
public User Create(UserName name) {
currentId++;
return new User(
new UserId(currentId.ToString()), name
);
}
}
#デザインパターン