Шаблон проектирования для создания объекта из другого объекта различными способами

#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. Этот шаблон позволяет клиенту настраивать способ построения объекта.