Шаблон проектирования для создания объекта из другого объекта различными способами - PullRequest
4 голосов
/ 10 мая 2011

Мне нужно создать объект X, используя свойства объекта Y (оба имеют один и тот же тип) 4-5 различными способами, т.е. в зависимости от ситуации, эти свойства Y могут использоваться для инициализации X различными способами. Один из способов сделать это - создать объект X, используя конструктор по умолчанию, а затем установить его свойства, но у него есть недостаток, заключающийся в том, что если возникает какая-то проблема, то объект находится в несогласованном состоянии. Другой способ сделать это - создать разные конструкторы для всех случаев с фиктивными параметрами, что звучит очень плохо. Есть ли хороший шаблон дизайна, который я могу использовать здесь?

Ответы [ 5 ]

6 голосов
/ 10 мая 2011

Если оба объекта относятся к одному и тому же типу, вы можете использовать фабричные методы:

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 в качестве параметра.

3 голосов
/ 10 мая 2011

Похоже, вы могли бы использовать слегка специализированную версию Factory Pattern . Например. Часть построения объекта может состоять в передаче существующего экземпляра (или интерфейса к экземпляру) для инициализации нового объекта.

2 голосов
/ 04 сентября 2011

Хорошее объяснение для Factory Pattern можно найти здесь .
Также Джошуа Блох в своей книге «Эффективная Java» предлагает некоторые преимущества использования статических фабрик

0 голосов
/ 10 мая 2011

Это звучит как случай для Abstract Factory паттерна.

0 голосов
/ 10 мая 2011

В дополнение к фабричному шаблону взгляните на шаблон строителя . Этот шаблон позволяет клиенту настроить способ создания объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...