不需要创建逻辑的模型实例化工厂的好处

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
   }

两个好处,一个有点抽象,一个很实用。

  1. 对象实例化是一项单独的责任。在 SRP 下,你的业务逻辑代码不应该这样做。对象创建的责任属于组合根和工厂。

  2. 如果您的代码使用 new,则或多或少没有办法用另一个 class 来替代单元测试。如果您的代码使用某种 IXXXFactory,您的单元测试代码可以提供自己的工厂,该工厂将 return 模拟或存根对象,允许您隔离测试中的 class。这使得单元测试更加容易。