原型模式与泛型而不是克隆

时间:2016-01-03 18:18:12

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

我一直在阅读GoF模式书,我想知道使用泛型是否会获得与使用原型模式的传统克隆实现相同的结果。 也许我不能正确理解原型模式,所以让我知道那里发生的事情是不是原型模式。

据我所知,原型模式基本上不是为不同的子类创建不同的工厂,而是将子类传递给构造函数中的工厂,以便从该蓝图实例化子类。

在下面的例子中 我将此工厂应该返回的对象类型设置为泛型,并在调用make项时将其实例化。

示例:

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)



        let entity2 = NSFetchRequest(entityName: "Ustawienia")
        entity2.fetchLimit = 1
        do{
            let wpis2 = try moc3.executeFetchRequest(entity2) as! [NSManagedObject]
            let ust = wpis2 as [NSManagedObject]
            if (wpis2.count==1){
                let ustawienia = wpis2[0] as! Ustawienia
                if (ustawienia.ust=="n"){
                    tabela="n"
                }
                else
                {
                    tabela="p"
                }
                if (ustawienia.wym=="w"){
                    wymienniki="w"
                }
                else
                {
                    wymienniki="p"
                }
            }
            else
            {
                NSLog("data not loaded")

            }

        }
        catch
        {
            fatalError("error \(error)")
        }
}

GenericFactory:

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();
    }

}

2 个答案:

答案 0 :(得分:1)

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

它与纯类形式的子类没有任何关系。你正在混淆工厂和原型。

答案 1 :(得分:0)

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

它是通用的工厂。通过仿制药尚未实现原型设计。

另一方面,原型模式集中在如何通过克隆从现有对象创建对象的副本。工厂只是给我们一个优雅的方法来创建这些克隆。

如果事情仍然不清楚,你可以在我的博客中引用我在原型模式上写的文章 - http://www.javabrahman.com/design-patterns/prototype-design-pattern-in-java/