1. 程式人生 > >設計模式:原型模式(Prototype)

設計模式:原型模式(Prototype)

一、類圖

二、模式含義

Prototype(抽象原型類):a.它是宣告克隆方法的介面,是所有具體原型類的公共父類,

                                             b.可以是抽象類也可以是介面,甚至還可以是具體實現類。

ConcretePrototype(具體原型類):它實現在抽象原型類中宣告的克隆方法,在克隆方法中返回自己的一個克隆物件。

Client(客戶類):a.通過呼叫該物件的克隆方法即可得到多個相同的物件。

                               b.由於客戶類針對抽象原型類Prototype程式設計,因此使用者可以根據需要選擇具體原型類

三、Java語言提供的clone()方法  

所有的Java類都繼承自java.lang.Object。事實上,Object類提供一個clone()方法,可以將一個Java物件複製一份。因此在Java中可以直接使用Object提供的clone()方法來實現物件的克隆,Java語言中的原型模式實現很簡單。

 注意:能夠實現克隆的Java類必須實現一個標識介面Cloneable,表示這個Java類支援被複制。如果一個類沒有實現這個介面但是呼叫了clone()方法,Java編譯器將丟擲一個CloneNotSupportedException異常。

Java語言中的clone()方法滿足:

              (1) 對任何物件x,都有x.clone() != x,即克隆物件與原型物件不是同一個物件;

              (2) 對任何物件x,都有x.clone().getClass() == x.getClass(),即克隆物件與原型物件的型別一樣;

              (3) 如果物件x的equals()方法定義恰當,那麼x.clone().equals(x)應該成立。

為了獲取物件的一份拷貝,我們可以直接利用Object類的clone()方法,具體步驟如下:

              (1) 在派生類中覆蓋基類的clone()方法,並宣告為public;

              (2) 在派生類的clone()方法中,呼叫super.clone();

              (3) 派生類需實現Cloneable介面。

              此時,Object類相當於抽象原型類,所有實現了Cloneable介面的類相當於具體原型類。