Шаблон прототипа с дженериками вместо клонирования

Я читал книгу шаблонов GoF, и мне интересно, приведет ли использование дженериков к тем же результатам, что и использование обычной реализации клонирования шаблона прототипа. Возможно, я неправильно понимаю шаблон прототипа, поэтому дайте мне знать, если то, что там происходит, не является шаблоном прототипа.

Насколько я понимаю, шаблон прототипа в основном состоит в том, чтобы вместо создания разных фабрик для разных подклассов вы передавали подкласс фабрике в конструкторе, чтобы он создавал экземпляры подклассов из этого плана.

В приведенном ниже примере я устанавливаю тип объектов, которые эта фабрика должна возвращать как универсальный, и создаю его экземпляр при вызове make item.

Пример:

public class PrototypedFactory {
    Prototype prototype;

    public PrototypedFactory(Prototype prototype) {

        this.prototype = prototype;
    }

    public Prototype makeItem() throws CloneNotSupportedException {
        return (Prototype) prototype.clone();

    }

    public static void main(String[] args) throws Exception {
        GenericFactory<ConcretePrototype> factoryGeneric = new GenericFactory<ConcretePrototype>(
                ConcretePrototype.class);
        PrototypedFactory factory = new PrototypedFactory(new ConcretePrototype());

        Prototype item = factory.makeItem();
        Prototype item2 = factoryGeneric.makeItem();
        System.out.println(item.getName());
        System.out.println(item2.getName());
    }

}

ОбщийФабрика:

public class GenericFactory<T extends Prototype> {
    Class<T> c;

    public GenericFactory(Class<T> clazz) {
        c = clazz;
    }

    public Prototype makeItem() throws Exception {
        return c.newInstance();
    }

}

Прототип:

public abstract class Prototype implements Cloneable {
    String name = "prototype";

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public String getName() {
        return name;
    }
}

person Diaa    schedule 03.01.2016    source источник


Ответы (2)


Идея прототипа заключается в том, что вы можете настроить объект-прототип так, как хотите, и вы всегда будете получать идеальные копии. Вы не можете достичь этого с помощью дженериков, поэтому требуется подход, подобный клонированию.

Он также не имеет ничего общего с подклассами в чистом виде. Вы путаете фабрики и прототипы.

person Kayaman    schedule 03.01.2016

Вы создали универсальную фабрику, которая может создавать экземпляры объектов универсального типа, которым она инициализирована. Таким образом, ваш дизайн является улучшением по сравнению с созданием нескольких фабричных классов для нескольких типов объектов, которые должны быть клонированы, - теперь создание нескольких типов объектов с использованием одного и того же фабричного класса.

Это фабрика, которая является универсальной. Прототипы не были достигнуты с помощью дженериков.

Шаблон прототипа, с другой стороны, сконцентрирован на том, как создавать копии объектов из существующих объектов путем клонирования. Фабрики просто дают нам элегантный способ создавать эти клоны.

Если что-то все еще неясно, вы можете сослаться на статью, которую я написал о шаблоне Prototype в моем блоге - http://www.javabrahman.com/design-patterns/prototype-design-pattern-in-java/ .

person Dhruv Rai Puri    schedule 04.01.2016