Фабрика или конструктор — где устанавливать свойства объекта?

#php #constructor #factory

#php #конструктор #фабрика

Вопрос:

Я немного смущен тем, какое правильное место для установки свойств объекта, в конструкторе или в фабричном методе, или это не имеет значения?

В конструкторе:

 class Foo {
    public $bar;
    function __constructor($b) {
        $this->bar = $b;
    }

    static function factory($b) {
        return new self($b);
    }
}
  

На фабрике:

 class Foo {
    public $bar;    

    static function factory($b) {
        $obj = new self();
        $obj->bar = $b;
        return $obj;
    }
}
  

Комментарии:

1. В вашем примере фабричный метод и конструктор делают то же самое. Для вашего кода это не имеет значения.

2. Что касается фабрики, это не имеет никакого значения, потому что она инкапсулирована 🙂

3. Почему именно вы хотите использовать фабричный метод для возврата self вообще?

4. @vzwick Это был просто пример для демонстрации моего вопроса. Но в реальном мире мне нравится использовать шаблон: Class::factory()-> do_something()-> do_something_else() вместо $ c = new Class(); $ c-> do_something()-> do_something_else() .

5. Гул. Я всегда думал, что шаблон factory должен был включать условную последующую загрузку классов во время выполнения … Никогда не думал об этом как о способе сэкономить дополнительную строку для назначения.

Ответ №1:

Вопрос в том, можете ли вы создать экземпляр класса без установки свойства b. Если это будет работать, вам не нужно устанавливать свойство в конструкторе. Если свойство важно для работы других методов, вы должны установить его в конструкторе. Фабрика не имеет к этому никакого отношения. Если бы фабрика была единственным способом создания экземпляра класса (конструктор был закрытым), тогда код был бы инкапсулирован, но все равно вам нужно передать необходимые параметры конструктору, иначе вы можете легко забыть о них при рефакторинге вашего кода.