BonBonSlick
@BonBonSlick
Vanilla Full Stack Web Architector

Приватный конструктор или фабричные методы?

Возник вопрос, а надо ли давать возможность отовсюду инициализировать конструктор класса?

public function __construct(
        Uuid $uuid
    ) {
        $this->uuid = $uuid;
    }

    public function createFromApi($newUserData)
    {
        UserFactory::fromApi($newUserData);
    }
    
    public function createFromAdminPanel($newUserData)
    {
        UserFactory::fromAminPanel($newUserData);
    }
    
    public function createFromImport($newUserData)
    {
        UserFactory::fromImport($newUserData);
    }

В фабричных методах, мы создаем класс таким образом, да бы он соответствовал бизнес логике приложения в конкретной ситуации.

Или же оставить конструктор публичным? Но тогда класс могут инициализировать где угодно, а так new User() будет только и столько в фабричном методе определенного типа в зависимости от условий создания.
  • Вопрос задан
  • 175 просмотров
Решения вопроса 1
@BorisKorobkov
Web developer
надо ли давать возможность отовсюду инициализировать конструктор класса?

Да. Единственное исключение - singleton.

public function createFromApi($newUserData)
public function createFromAdminPanel($newUserData)
public function createFromImport($newUserData)

Это нарушает SOLID.

В фабричных методах, мы создаем класс таким образом, да бы он соответствовал бизнес логике приложения в конкретной ситуации.

Значит, у вас неправильная бизнес-логика и неправильная структура классов.
Фабрика - это всего-лишь хелпер, которая создает и предустанавливает некоторые свойства объекта. При этом никто не мешает их потом поменять или сделать все то же самое без фабрики.

P.S. Если конструктор сделать приватным, то фабрика (некий сторонний объект) не сможет создать объект.
Если же вы собираетесь фабрику засунуть внутрь самого объекта, то это говнокод.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы