2013-10-10 46 views
-1

我讀過你可以使用類對象,而不是使用克隆原型。但我不明白使用類對象而不是那個是什麼意思?任何人都可以舉一個例子,如果有人明白什麼意思使用類對象,而不是原型模式?Java - 使用類對象而不是原型?

+3

,我們談論的Java或JavaScript在這裏? –

+2

這個問題還不清楚。請澄清。 –

+2

你有鏈接到你閱讀的文章嗎?原型創建是創建對象層次結構時的一種解決方案,相關操作既昂貴又不可行。舉一個遊戲狀態的例子 - 讓我們假設你玩了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()); 
    } 
} 

Demo of the above approach on ideone

你可以用一個Class<T>代替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); 
    } 
} 

Demo of the second approach on ideone.

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」;

相關問題