【问题标题】:Prototype pattern with Generics instead of clonable使用泛型而不是可克隆的原型模式
【发布时间】:2016-01-03 18:18:11
【问题描述】:

我一直在阅读 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;
    }
}

【问题讨论】:

    标签: java generics design-patterns clone prototype-pattern


    【解决方案1】:

    原型背后的理念是,您可以按照自己的方式配置原型对象,并且您将始终获得完美的副本。使用泛型无法实现这一点,因此需要类似克隆的方法。

    它也与纯粹形式的子类没有任何关系。你把工厂和原型混在一起了。

    【讨论】:

      【解决方案2】:

      您已经创建了一个通用工厂,它可以实例化它所初始化的通用类型的对象。因此,您的设计是对为要克隆的多种类型的对象创建多个工厂类到现在使用相同的工厂类创建多个对象类型的改进。

      它的工厂是通用的。原型尚未通过泛型实现。

      另一方面,原型模式专注于如何通过克隆从现有对象创建对象的副本。工厂只是为我们提供了一种创建这些克隆的优雅方式。

      如果还有不清楚的地方,可以参考我在博客-http://www.javabrahman.com/design-patterns/prototype-design-pattern-in-java/写的关于原型模式的文章。

      【讨论】:

        猜你喜欢
        • 2018-03-26
        • 2011-01-26
        • 2015-04-29
        • 1970-01-01
        • 2015-02-14
        • 2019-01-06
        • 1970-01-01
        • 1970-01-01
        • 2014-05-23
        相关资源
        最近更新 更多