不需要创建逻辑的模型实例化工厂的好处
Benefits of a Factory for model instantiation without need for creation logic
有了 DDD 和其他一些抽象原则,当需要实例化不稳定的实例(否定稳定的 C# 实例化和原语)时,工厂模式的逻辑在需要定义业务时(有时)是有意义的实例化时的逻辑(安全优势,性能可能不需要为新分配内存等),但是,如果实例不需要任何实例化逻辑,但它本身以及其他相关模型在同一个地方的多个地方使用怎么办class(示例是下面创建的非常简化的代码......在适用的情况下将 public 更改为最低权限等)
与内联实例化(依赖倒置或其他)相比,将实例化抽象为工厂模式是否有好处? ...我发现的大多数搜索都涉及工厂模式的优缺点、替代方案、静态与 DI(Bloch 的有效 Java)等
public interface IUserTypeFactory
{
User CreateUser();
Admin CreateAdmin();
Reporter CreateReporter();
}
public class UserTypeFactory : IUserTypeFactory
{
public User CreateUser() => new User();
public Admin CreateAdmin() => new Admin();
public Reporter CreateReporter() => new Reporter();
}
public class UserService
{
private readonly IUserTypeFactory _userTypeFactory;
public UserService(IUserTypeFactory userTypeFactory) => _userTypeFactory = userTypeFactory;
public void DoSomething()
{
var user = _userTypeFactory.CreateUser();
// .. business logic
}
// More Methods requiring instantiation
}
两个好处,一个有点抽象,一个很实用。
对象实例化是一项单独的责任。在 SRP 下,你的业务逻辑代码不应该这样做。对象创建的责任属于组合根和工厂。
如果您的代码使用 new
,则或多或少没有办法用另一个 class 来替代单元测试。如果您的代码使用某种 IXXXFactory
,您的单元测试代码可以提供自己的工厂,该工厂将 return 模拟或存根对象,允许您隔离测试中的 class。这使得单元测试更加容易。
有了 DDD 和其他一些抽象原则,当需要实例化不稳定的实例(否定稳定的 C# 实例化和原语)时,工厂模式的逻辑在需要定义业务时(有时)是有意义的实例化时的逻辑(安全优势,性能可能不需要为新分配内存等),但是,如果实例不需要任何实例化逻辑,但它本身以及其他相关模型在同一个地方的多个地方使用怎么办class(示例是下面创建的非常简化的代码......在适用的情况下将 public 更改为最低权限等)
与内联实例化(依赖倒置或其他)相比,将实例化抽象为工厂模式是否有好处? ...我发现的大多数搜索都涉及工厂模式的优缺点、替代方案、静态与 DI(Bloch 的有效 Java)等
public interface IUserTypeFactory
{
User CreateUser();
Admin CreateAdmin();
Reporter CreateReporter();
}
public class UserTypeFactory : IUserTypeFactory
{
public User CreateUser() => new User();
public Admin CreateAdmin() => new Admin();
public Reporter CreateReporter() => new Reporter();
}
public class UserService
{
private readonly IUserTypeFactory _userTypeFactory;
public UserService(IUserTypeFactory userTypeFactory) => _userTypeFactory = userTypeFactory;
public void DoSomething()
{
var user = _userTypeFactory.CreateUser();
// .. business logic
}
// More Methods requiring instantiation
}
两个好处,一个有点抽象,一个很实用。
对象实例化是一项单独的责任。在 SRP 下,你的业务逻辑代码不应该这样做。对象创建的责任属于组合根和工厂。
如果您的代码使用
new
,则或多或少没有办法用另一个 class 来替代单元测试。如果您的代码使用某种IXXXFactory
,您的单元测试代码可以提供自己的工厂,该工厂将 return 模拟或存根对象,允许您隔离测试中的 class。这使得单元测试更加容易。