原型模式

------------------------------------原型模式-----------------------------------------

²  原型模式(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);             

              }

       }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章