#java #design-patterns #constructor
#java #шаблоны проектирования #конструктор
Вопрос:
Я должен создать объект X, используя свойства объекта Y (оба имеют один и тот же тип) 4-5 различными способами, т. Е. в зависимости от ситуации, эти свойства Y могут использоваться для инициализации X различными способами. Один из способов сделать это — создать объект X, используя конструктор по умолчанию, а затем задать его свойства, но у него есть недостаток, заключающийся в том, что при возникновении какой-либо проблемы у нас есть объект в несогласованном состоянии. Другой способ сделать это — создать разные конструкторы для всех случаев с фиктивными параметрами, что звучит действительно плохо. Есть ли какой-нибудь хороший шаблон проектирования, который я могу здесь использовать?
Ответ №1:
Если оба объекта одного типа, вы можете использовать фабричные методы:
public class Foo {
...
public Foo withBar(...) {
Foo f = new Foo(this.param);
f.setBar(...);
return f;
}
public Foo withBaz(...) {
Foo f = new Foo(this.param);
f.setBaz(...);
return f;
}
}
...
Foo y = ...;
Foo x = y.withBar(...);
Если типы отличаются, вы можете сделать заводские методы статическими и передать Y в качестве параметра.
Комментарии:
1. Является ли хорошей практикой передавать Y (другой тип) в качестве параметра конструктору X? И т.д.,
public Foo(Bar y) { ... }
Ответ №2:
Похоже, вы могли бы использовать слегка специализированную версию фабричного шаблона. Например. Частью создания объекта может быть передача существующего экземпляра (или интерфейса к экземпляру) для инициализации нового объекта.
Комментарии:
1. 1 дополнительно использование «фабричного метода» было бы удовлетворительным для этого случая
2. @user625146: Согласен. Я использовал шаблон вместо метода, потому что думал, что это может помочь архитектуре kcr.
3. В заводском шаблоне, когда использовать их как статические, а когда нет?
4. Фабричный метод на самом деле не подходит для использования статических классов. Они больше касаются экземпляров. Я думаю, что в вашем случае вы используете несколько объектов с разными состояниями, я бы посоветовал держаться подальше от попыток что-либо делать со статическими элементами.
Ответ №3:
Хорошее объяснение шаблона Factory можно найти здесь.
Также Джошуа Блох в своей книге «Эффективная Java» предлагает некоторые хорошие преимущества использования статических фабрик
Ответ №4:
Это звучит как пример шаблона Abstract Factory.
Ответ №5:
В дополнение к шаблону Factory, взгляните на шаблон Builder. Этот шаблон позволяет клиенту настраивать способ построения объекта.