Преимущества Factory для создания экземпляров модели без необходимости создания логики - PullRequest
0 голосов
/ 11 июля 2020

С DDD и некоторыми другими принципами абстракции, когда возникает необходимость в создании экземпляров нестабильных экземпляров (отрицание стабильных C# экземпляров и примитивов), logi c для шаблона Factory имеет смысл (иногда) при необходимости определить бизнес-логи c во время создания экземпляра (преимущества безопасности, производительность с возможным отсутствием необходимости выделения памяти для нового и т. д. c.), однако, что, если экземпляру не требуются какие-либо логики создания экземпляра c, а сам а также другие связанные модели используются в нескольких местах одного и того же класса (пример представляет собой очень упрощенный код, созданный ниже ... изменение publi c на минимальные привилегии, где это возможно, et c.)

Есть ли преимущества абстрагирования экземпляра в шаблоне фабрики по сравнению с встроенным экземпляром (будь то инверсия зависимостей или другое)? ... большинство поисков, которые я нашел, касаются плюсов и минусов фабричного шаблона, альтернатив, stati c vs DI (Bloch's Effective Java), et c.

   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 Ответ

0 голосов
/ 11 июля 2020

Два преимущества: одно абстрактное и одно практическое.

  1. Создание экземпляра объекта - это отдельная обязанность. В соответствии с SRP код вашей бизнес-логики c не должен этого делать. Ответственность за создание объекта лежит на составе root и фабриках.

  2. Если в вашем коде используется new, более или менее нет возможности заменить другой класс для модульного тестирования. Если в вашем коде используется какой-либо тип IXXXFactory, ваш код модульного тестирования может предоставить свою собственную фабрику, которая будет возвращать фиктивные или заглушки, позволяя вам изолировать тестируемый класс. Это значительно упрощает модульное тестирование.

...