------------------------------------原型模式-----------------------------------------
² 原型模式(Prototype Pattern):它是一種對象創建型模式,用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。
² 模式動機:
有些系統(界面上一個圖片,右擊,複製到另外一個地方,一個對象就變成兩個對象)裏面涉及到對象的複製(克隆),這種情況下編程,有何套路?
在要複製的類裏面編寫一個克隆方法(clone(),該方法來源於Object,該方法屬於Java特性,能夠提供複製功能),實現複製。
所有的Java類都繼承自java.lang.Object, 而Object類提供一個clone()方法,可以將一個Java對象複製一份。但是,這個Java類必須實現一個標識接口Cloneable,標識這個Java類支持複製。但是該方法不可靠:只能實現對象內值內容的克隆,無法實現引用類型的克隆,所以該方法叫做淺克隆,僅僅適合簡單情況下克隆。果要實現真正的克隆,需要藉助“深克隆”(Java中用讀寫流的方法)
² 優點:原型模式在很多軟件都可以找到它的應用,如果實例化一個類要花大量時間,原型模式是最好的解決方案。
² 缺點:最主要缺點就是每一個類必須配備一個克隆方法。而且這個克隆方法需要對類的功能進行通盤考慮,這對全新的類來說不是很難,但對已有的類進行改造時,不一定是件容易的事。另一個缺點是在實現深克隆時需要編寫較爲複雜的代碼。
實例1:淺克隆
----------------------------------------------------淺克隆的實現---------------------------------------------------------
class Word3 implements java.lang.Cloneable{//可以被克隆
String content;
String fontName;
String fontColor;
int fontSize;
public Word3(String content,String fontName,String fontColor,int fontSize){
this.content = content;
this.fontName = fontName;
this.fontColor = fontColor;
this.fontSize = fontSize;
}
/*要點:定義一個方法,通過clone來獲得對象拷貝
這是業界推薦的方法。但是該方法有隱患,只能拷貝值對象,無法
拷貝引用對象
*/
public Word3 copy() throws Exception{
return (Word3)this.clone();//快速克隆,只拷貝數據
}
}
class Prototype3{
public static void main(String[] args) throws Exception{
Word3 w1 = new Word3("好","黑體","藍色",50);
Word3 w2 = w1.copy();//克隆
System.out.println("W1的內容是:" + w1.content);
System.out.println("W2的內容是:" + w2.content);
w1.content = "壞";
System.out.println("W2的內容是:" + w2.content);
}
}
--------------------------------------------深度克隆的實現-----------------------------------------------------
class Font implements java.io.Serializable{
String fontName;
String fontColor;
int fontSize;
public Font(String fontName,String fontColor,int fontSize){
this.fontColor = fontColor;
this.fontName = fontName;
this.fontSize = fontSize;
}
}
/*單純克隆叫做淺克隆,無法複製引用對象,如果要實現全面克隆
用深克隆:將對象寫入流中,然後取出*/
class Word4 implements java.io.Serializable{
String content;
Font font;//引用對象
public Word4(String content,Font font){
this.content = content;
this.font = font;
}
public Word4 copy() throws Exception{ //深克隆
ByteArrayOutputStream baos =
new ByteArrayOutputStream();
ObjectOutputStream oos =
new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais =
new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois =
new ObjectInputStream(bais);
return (Word4)ois.readObject();
}
}
class Prototype4{
public static void main(String[] args) throws Exception{
Word4 w1 = new Word4("好",new Font("黑體","藍色",50));
Word4 w2 = w1.copy();//克隆
System.out.println("W1的字體是:" + w1.font.fontName);
System.out.println("W2的字體是:" + w2.font.fontName);
w1.font.fontName = "宋體";
System.out.println("w1改後W2的字體是:" + w2.font.fontName);
}
}