Если бы вы наткнулись на программу, которая занималась математикой, чтобы выяснить, в какой день недели это было повсеместно, что бы вы подумали? Вы, вероятно, подумали бы, что «математика для определения того, какой это день недели, должна быть в собственном методе, поэтому его можно выразить один раз и только один раз, причем метод вызывается везде, где код должен знать, в какой день». недели это ".
Построение объекта ничем не отличается от выяснения, какой это день недели. Сделайте это в одном месте, создайте этот метод и вызывайте этот метод везде, где вам нужен новый объект.
Теперь, в некоторых случаях, этот метод сам может быть конструктором (конструктор на самом деле просто забавный метод, верно?). В других случаях метод вызывает конструктор, который больше нигде не будет использоваться. Это зависит от того, сколько работы нужно сделать для создания объекта, и насколько вы хотите скрыть класс создаваемого объекта (представьте фабричный метод createDaysOfTheWeek
- он может вернуть Collection<DayOfTheWeek>
и скрыть факт что это ArrayList
или LinkedHashSet
или EnumSet
или что-то еще). Обертывание конструкции в фабричном методе дает вам больше инкапсуляции, но меньше прозрачности. Оба эти качества необходимы для создания хорошего кода, но, как и пиво и пироги, вы должны иметь баланс между ними.