Ну, вопрос в том, как вы хотите, чтобы это работало ... Есть несколько шаблонов, построенных вокруг этой концепции.
Если вы хотите получить один :
Если у вас много похожих вещей (например, людей), то вам может потребоваться Абстрактная фабрика . В этом случае вы, скорее всего, не захотите, чтобы оно было статичным. Но опять же, вам нужен экземпляр, чтобы вы могли связать свои отдельные фабрики с абстрактной фабрикой. Таким образом, вы обойдете фабрику «Персональный строитель». Затем, когда вы ищете человека, вы позвоните builder.buildPerson(id)
. Этот метод будет искать индивида, определять класс для фактической реализации и вызывать соответствующую фабрику.
Если есть только один тип "персонажа", я бы использовал Фабричный метод . В этом случае, поскольку класс (и его дочерние элементы) отвечают за создание экземпляров, статические методы являются предпочтительным способом. Так что тогда вы бы позвонили person::getPerson(id)
.
Если вы хотите получить много :
Если вы хотите привлечь много людей (например, с помощью метода findPeople
), то окончательное решение, скорее всего, будет зависеть от ваших потребностей.
Если вам нужна какая-то эффективность при создании объекта, то вы, вероятно, ищете шаблон Flyweight .
В противном случае, если вы используете абстрактную фабрику, создайте метод экземпляра для поиска нескольких элементов на основе атрибутов. Если вы используете фабричный метод, добавьте другой статический метод, чтобы найти их.
Но другой взгляд на это
То, что «хранение» и «загрузка» данных для объекта не связано с самим объектом, поэтому он не принадлежит как метод (статический или нет). В этом случае было бы лучше иметь модель, представляющую хранилище данных. Затем, чтобы получить список пользователей, вы должны позвонить peoplemodel.getPerson(id)
. peoplemodel
будет извлекать данные из БД и загружать информацию, необходимую для построения объекта (ов). Затем он вызовет фабрику для класса person, чтобы создать реальный объект и вернуть его.
Это хорошо, потому что это отделяет хранилище от реализации. Конечно, это еще один уровень, но дополнительный уровень позволяет вам делать такие вещи, как иметь несколько хранилищ данных, или использовать один и тот же класс person для нескольких приложений с различными требованиями к хранилищу (поскольку весь класс заботится о передаваемых данных).
Итак, в заключение :
Теперь вы не можете добиться слабой связи отдельных компонентов с помощью статических методов, поэтому в этом случае вам придется использовать экземпляры с обеих сторон. Таким образом, вы должны передать конструктор модели (внедрение зависимости) для создания объектов людей. А поскольку сама модель слабо связана, вы получите ее экземпляр и передадите туда, где вам нужно загружать людей.
Короче говоря, это зависит от того, что вы пытаетесь сделать. Но если вам нужен самый слабосвязанный код (наиболее многократно используемый и наиболее обслуживаемый), тогда держитесь подальше от статических методов и придерживайтесь абстрактных фабрик / сборщиков и DI ...