設計模式學習(1) 原型模式

2021-08-22 18:10:14 字數 2549 閱讀 4399

先來個原型設計模式的個人理解:屬於建立型設計模式

(單例模式singleton、建造者模式builder、工廠模式factory、原型模式prototype)的一種。其中單例、建造者、工廠模式後面學習。原型模式其實就是複製產生物件。和new出物件比起來。效能更好,所以用得也比較廣泛。實現方式就是實現cloneable介面。呼叫object的clone()方法,進行淺拷貝。下面是詳細介紹:

在介紹這個原型模式是什麼的時候,我們先看一段**

package prototypedesign;

public class book implements cloneable

}

上面這段**book類實現了cloneable介面。book類的物件可以呼叫這個clone()方法生成乙個新的的物件。讓我想到在很多地方需要生成類例項的時候,我們可以不用new的形式來建立物件。因為上文說過,拷貝比new效能更好。我們再需要乙個呼叫入口:

public class testutils 

}

就這樣,根據book物件,clone一下,就生成了book1了。這就是我理解的原型模式最簡單的實現。當然我們可以把book例項私有化一下,放到工具類裡面,再寫乙個靜態方法,就可以實現隨用隨調了。比如:

package prototypedesign;

public class targetutils

}

public class test 

}

你看,稍微包裝一下就可以用工具類的方式來創造乙個book例項了。雖然這樣寫**要多一點,但是乙個物件多次被new的話,用這種方式,可以提高效能,物件越複雜,差異就越明顯。

現在我們再來總結一下,何為原型模式。即我們再建立乙個物件的時候需要借助乙個原型,而上例中book就是這個原型,當然要想clone出新例項,必須還要實現cloneable介面。所以這裡又有乙個知識點需要我們去擴充套件,那就是cloneable介面,需要我們去了解。

於是乎我在學習的過程中有去看了一下cloneable介面,個人理解,這哥們就是乙個標識

,就像serializable介面一樣。按理說所有類都繼承的object裡面就有乙個clone()方法。但如果不實現一下cloneable介面,呼叫clone()會丟擲clonenotsupportedexception異常。沒這哥們成不了事。

接下來我們來說說這個clone()方法稍微深一點的東西:關於深拷貝和淺拷貝。先把定義放這:

淺拷貝: 對簡單型別的成員變數進行值的複製,對引用型別的成員變數只複製引用,不複製引用的物件.

深拷貝: 對簡單型別的成員變數進行值的複製,對引用型別的成員變數也進行引用物件的複製.

來來來,上**加以解釋:

package prototypedesign;

public class book implements cloneable

}

把最前面的**再搬到這裡來。這就是淺拷貝 ,book中的pagenum是簡單型別的成員變數。在轉殖時對值進行了複製,author是引用型別的成員變數,把引用位址複製給了新的例項。也就是說新生成的book例項和原型例項的author屬性所引用的是同乙個記憶體空間。這就是淺拷貝。不知道你理解了嗎?

相反深拷貝就是把author的例項也一樣拷貝乙份。讓新生成例項的author屬性和原型例項的author屬性指向不同的記憶體空間。通常我們clone()都是淺拷貝。如果需要實現深拷貝,我們可以對引用型別的屬性再拷貝乙份,如果遇到裡面還有引用型別的,就需要再淺拷貝一次,然後通過set方法裝載進去。還有一種就是通過序列化,再反序列化實現。

針對深拷貝,上點**說明一下

package prototypedesign;

public class author implements cloneable

//省略了set和get方法

}

package prototypedesign;

public class targetutils

}

看看上面的兩段**,把author的例項也淺拷貝了一下。然後裝載如book新例項中。當然如果author也有引用型別的屬性,那也需要像這樣clone來裝載進去。

再上一段通過序列化反序列化實現深拷貝的**

public deepbook deepclone() throws ioexception, classnotfoundexception
這種方式一樣也實現了深拷貝的目的。

接下來就要開始記錄再深一點東西了。

呼叫object的clone()方法。是沒有呼叫構造方法的。開啟object類可以看到

protected native object clone() throws clonenotsupportedexception;
這是呼叫了c語音來實現的。是由虛擬機器直接複製的記憶體塊。所以速度比new出物件的方式要快很多

。同時又因為沒有呼叫建構函式,所以不受許可權的控制

學習設計模式 原型模式

說明 通過原型模式可以自動複製乙個例項化物件a給新的物件例項化物件b,這樣可以省去很多例項化 重複 的工作,便於維護。轉殖分為淺轉殖和深轉殖,淺轉殖只轉殖基礎型別資訊,對於類似物件這樣的複雜型別資訊,只轉殖這個物件的引用 深轉殖是基礎型別和複雜型別都轉殖其值,而不僅僅是轉殖引用 需求 複製簡歷,需要...

Android設計模式1 原型模式

原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。3.1 基類需要實現cloneable介面 created by ljw on 2019 3 12.原型模式 原型模式也是拷貝模式,就是在記憶體中拷貝原型物件來建立乙個跟原型物件一模一樣的新物件。原型模式的實質就是擴充套件使用...

設計模式 原型模式

1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...