1. 程式人生 > >Java學習筆記:原型模式總結

Java學習筆記:原型模式總結

type tex 實現類 null ges 復制 n) getattr ado

原型模式(Prototype Pattern)是首先創建一個原型對象,再通過復制這個原型對象來創建更多同類型的對象。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
技術分享圖片

這種模式是實現了一個原型接口,該接口用於創建當前對象的克隆。當直接創建對象的代價比較大時,則采用這種模式。例如,一個對象需要在一個高代價的數據庫操作之後被創建。我們可以緩存該對象,在下一個請求時返回它的克隆,在需要的時候更新數據庫,以此來減少數據庫調用。
在原型模式結構圖中包含如下幾個角色:
1.Prototype(抽象原型類):它是聲明克隆方法的接口,是所有具體原型類的公共父類,可以是抽象類也可以是接口,甚至還可以是具體實現類。
2.ConcretePrototype(具體原型類):它實現在抽象原型類中聲明的克隆方法,在克隆方法中返回自己的一個克隆對象。
3.Client(客戶類):讓一個原型對象克隆自身創建一個新的對象,在客戶類中只需要直接實例化或通過工廠方法等方式創建一個原型對象,再通過調用該對象的克隆方法即可得到多個相同的對象。由於客戶類針對抽象原型類Prototype編程,因此用戶可以根據需要選擇具體原型類,系統具有較好的可擴展性,增加或更換具體原型類都很方便。
原型模式的核心在於如何實現克隆方法,下面將介紹兩種在Java語言中常用的克隆實現方法:
1.通用實現方法。通用的克隆實現方法是在具體原型類的克隆方法中實例化一個與自身類型相同的對象並將其返回,並將相關的參數傳入新創建的對象中,保證它們的成員屬性相同。示意代碼如下所示:

class ConcretePrototype implements Prototype{private String attr; //成員屬性
public void setAttr(String attr)

{this.attr = attr;}public String getAttr()
{return this.attr;}
public Prototype clone() //克隆方法
{Prototype prototype = new ConcretePrototype(); //創建新對象
prototype.setAttr(this.attr);
return prototype;}}

  1. Java語言提供的clone()方法。學過Java語言的人都知道,所有的Java類都繼承自java.lang.Object。事實上,Object類提供一個clone()方法,可以將一個Java對象復制一份。因此在Java中可以直接使用Object提供的clone()方法來實現對象的克隆,Java語言中的原型模式實現很簡單。
    需要註意的是能夠實現克隆的Java類必須實現一個標識接口Cloneable,表示這個Java類支持被復制。如果一個類沒有實現這個接口但是調用了clone()方法,Java編譯器將拋出一個CloneNotSupportedException異常。如下代碼所示:
    class ConcretePrototype implements Cloneable
    {……public Prototype clone(){Object object = null;try {object = super.clone();} catch (CloneNotSupportedException exception)

{System.err.println("Not support cloneable");}
return (Prototype )object;}……}
在客戶端創建原型對象和克隆對象也很簡單,如下代碼所示:
Prototype obj1 = new ConcretePrototype();
Prototype obj2 = obj1.clone();
一般而言,Java語言中的clone()方法滿足:

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

2)對任何對象x,都有x.clone().getClass() == x.getClass(),即克隆對象與原型對象的類型一樣;
3)如果對象x的equals()方法定義恰當,那麽x.clone().equals(x)應該成立。為了獲取對象的一份拷貝,我們可以直接利用Object類的clone()方法,具體步驟如下:

a.在派生類中覆蓋基類的clone()方法,並聲明為public;

b.在派生類的clone()方法中,調用super.clone();

c.派生類需實現Cloneable接口。

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

Java學習筆記:原型模式總結