-1

我读到您可以使用类对象而不是使用带有克隆的原型。但是我不明白使用类对象代替它意味着什么?如果有人理解使用类对象而不是原型模式意味着什么,谁能举个例子?

4

2 回答 2

1

从 Java 5 开始,java.lang.Class它本身的类型是泛型的。这允许类以类型安全的方式创建其实例。

当您使用带有克隆的原型时,您可以执行以下操作:

interface Calculator {
    void setA(int a);
    void setB(int b);
    int compute();
    Calculator copy();
}
class Adder implements Calculator {
    private int a,b;
    public void setA(int a) {this.a=a;}
    public void setB(int b) {this.b=b;}
    public int compute() {return a+b;}
    public Calculator copy() {
        Adder res = new Adder();
        res.a = a;
        res.b = b;
        return res;
    }
}
class Multiplier implements Calculator {
    private int a,b;
    public void setA(int a) {this.a=a;}
    public void setB(int b) {this.b=b;}
    public int compute() {return a*b;}
    public Calculator copy() {
        Multiplier res = new Multiplier();
        res.a = a;
        res.b = b;
        return res;
    }
}
class Test {
    static void computeWithPrototype(Calculator proto) {
         Calculator calc = proto.copy();
         calc.setA(123);
         calc.setB(321);
         System.out.println(calc.compute());
    }
    public static void main(String[] args) throws Exception {
        computeWithPrototype(new Adder());
        computeWithPrototype(new Multiplier());
    }
}

在 ideone 上演示上述方法

Class<T>您可以使用 a而不是方法重写它copy,如下所示:

interface Calculator {
    void setA(int a);
    void setB(int b);
    int compute();
}
class Adder implements Calculator {
    private int a,b;
    public void setA(int a) {this.a=a;}
    public void setB(int b) {this.b=b;}
    public int compute() {return a+b;}
}
class Multiplier implements Calculator {
    private int a,b;
    public void setA(int a) {this.a=a;}
    public void setB(int b) {this.b=b;}
    public int compute() {return a*b;}
}
class Test {
    static <T extends Calculator> void computeWithClass(Class<T> calcClass)
    throws Exception {
         Calculator calc = calcClass.newInstance();
         calc.setA(123);
         calc.setB(321);
         System.out.println(calc.compute());
    }
    public static void main(String[] args) throws Exception {
        computeWithClass(Adder.class);
        computeWithClass(Multiplier.class);
    }
}

ideone 上第二种方法的演示。

于 2013-10-10T18:15:40.300 回答
0

在java中,当你创建一个对象时,它有一个引用内存。因此,当您尝试将该对象分配给变量时,您会传递参考内存。

例子 :

Person a = new Person(); a.setName("Person abc");
Person b = a; b.setName("Person yzw"); 
System.out.print(a.getName());
System.out.print(b.getName());

因此,当您修改属于此内存引用的属性时,您会同时修改两者。它将打印:“yzw yzw”;

因此,如果您不希望它发生,请使用 Cloneable 接口:

public class Person implements Cloneable{

    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

因此,当您调用 clone() 方法时,您将拥有两个不同的对象。例子:

Person a = new Person();
a.setName("Person abc");
Person b = (Person)a.clone(); 
System.out.print(a.getName());
System.out.print(b.getName());

它将打印:“abc yzw”;

于 2013-10-10T18:12:16.347 回答