3 原型模式

2022-09-09 13:36:28 字數 4707 閱讀 4627

傳統方式解決轉殖羊問題

**演示

需要複製的sheep類

package

com.wang.prototype;

public

class

sheep

public

string getname()

public

void

setname(string name)

public

intgetage()

public

void setage(int

age)

public

string getcolor()

public

void

setcolor(string color)

@override

public

string tostring()

}

需要使用複製類的客戶端

package

com.wang.prototype;

public

class

client

}

傳統的方式的優缺點

1) 優點是比較好理解,簡單易操作。

2) 在建立新的物件時,總是需要重新獲取原始物件的屬性,如果建立的物件比較複雜 時,效率較低

3) 總是需要重新初始化物件,而不是動態地獲得物件執行時的狀態, 不夠靈活

4) 改進的思路分析 思路:j**a中object類是所有類的根類,object類提供了乙個clone()方法,該方法可以 將乙個j**a物件複製乙份,但是需要實現clone的j**a類必須要實現乙個介面cloneable, 該介面表示該類能夠複製且具有複製的能力 => 原型模式

原型模式

基本介紹

1) 原型模式(prototype模式)是指:用原型例項指定建立物件的種類,並且通過拷 貝這些原型,建立新的物件

2) 原型模式是一種建立型設計模式,允許乙個物件再建立另外乙個可定製的物件, 無需知道如何建立的細節

3) 工作原理是:通過將乙個原型物件傳給那個要發動建立的物件,這個要發動建立 的物件通過請求原型物件拷貝它們自己來實施建立,即 物件.clone()

4) 形象的理解:孫大聖拔出猴毛, 變出其它孫大聖

原理結構圖說明 1)

prototype : 原型類,宣告乙個轉殖自己的介面

2) concreteprototype: 具體的原型類, 實現乙個轉殖自己的操作

3) client: 讓乙個原型物件轉殖自己,從而建立乙個新的物件(屬性一樣)

原型模式解決轉殖羊問題的應用例項

使用原型模式改進傳統方式,讓程式具有更高的效率和擴充套件性。

**演示:

原型類sheep實現cloneable介面,重寫clone方法

package

com.wang.prototype.improve;

public

class sheep implements

cloneable

public

string getname()

public

void

setname(string name)

public

intgetage()

public

void setage(int

age)

public

string getcolor()

public

void

setcolor(string color)

@override

protected object clone() throws

clonenotsupportedexception

@override

public

string tostring() ';}}

client讓乙個原型物件轉殖自己
package

com.wang.prototype.improve;

import

com.wang.prototype.improve.sheep;

public

class

client

}

<

bean

id="id01"

class

="com.atguigu.spring.bean.monster"

scope

="prototype"

/>

test.j**a

//獲取monster[通過id獲取monster]

深入討論-淺拷貝和深拷貝

淺拷貝的介紹

1) 對於資料型別是基本資料型別的成員變數,淺拷貝會直接進行值傳遞,也就是將 該屬性值複製乙份給新的物件。

2) 對於資料型別是引用資料型別的成員變數,比如說成員變數是某個陣列、某個類 的物件等,那麼淺拷貝會進行引用傳遞,也就是只是將該成員變數的引用值(內 存位址)複製乙份給新的物件。因為實際上兩個物件的該成員變數都指向同乙個 例項。在這種情況下,在乙個物件中修改該成員變數會影響到另乙個物件的該成 員變數值

3) 前面我們轉殖羊就是淺拷貝

4) 淺拷貝是使用預設的 clone()方法來實現 sheep = (sheep) super.clone();

深拷貝基本介紹

1) 複製物件的所有基本資料型別的成員變數值

2) 為所有引用資料型別的成員變數申請儲存空間,並複製每個引用資料型別成員變 量所引用的物件,直到該物件可達的所有物件。也就是說,物件進行深拷貝要對 整個物件進行拷貝

3) 深拷貝實現方式1:重寫clone方法來實現深拷貝

深拷貝應用例項

1) 使用 重寫clone方法實現深拷貝

需要單獨clone的深拷貝引用物件

package

com.wang.prototype.deepclone;

import

j**a.io.serializable;

public

class

deepcloneabletarget

implements

serializable, cloneable

//因為該類的屬性,都是string , 因此我們這裡使用預設的clone完成即可

@override

protected object clone() throws

clonenotsupportedexception

@override

public

string tostring() ';}}

原型物件deepprototype(包含引用物件)

package

com.wang.prototype.deepclone;

import

j**a.io.serializable;

public

class deepprototype implements

serializable,cloneable

@override

protected object clone() throws

clonenotsupportedexception

}

實現轉殖

package

com.wang.prototype.deepclone;

import

com.wang.prototype.improve.sheep;

public

class

client

}

結果

引用物件不是同乙個了 實現了引用物件clone

2) 使用序列化來實現深拷貝

3) **演示

package

com.wang.prototype.deepclone;

import j**a.io.*;

public

class deepprototype implements

serializable,cloneable

public object deepclone() throws classnotfoundexception, ioexception catch (ioexception e) finally}}

原型模式的注意事項和細節

1) 建立新的物件比較複雜時,可以利用原型模式簡化物件的建立過程,同時也能夠提 高效率

2) 不用重新初始化物件,而是動態地獲得物件執行時的狀態

3) 如果原始物件發生變化(增加或者減少屬性),其它轉殖物件的也會發生相應的變化, 無需修改**

4) 在實現深轉殖的時候可能需要比較複雜的**

5) 缺點:需要為每乙個類配備乙個轉殖方法,這對全新的類來說不是很難,但對已有 的類進行改造時,需要修改其源**,違背了ocp原則

建立型模式 原型模式

使用原型例項指定建立物件的種類,並且通過轉殖這些原型建立新的物件 原理是將乙個原型物件傳給要發動建立的物件,該物件通過請求原型物件轉殖自己來建立過程 轉殖方法 public prototype clone jdk中為我們提供了轉殖的方法clone 從object繼承下來,乙個物件要實現轉殖,需要實現...

建立型模式 原型模式

原型 prototype 模式主要用於建立物件的轉殖,通常其最簡單的形式就是採用自定 clone 函式並 傳入物件引數以返回此物件的乙個副本,這在 python 實作上可使用內定 copy.cop y 或 copy.deepcopy 函式來達到此目的。當已有乙個物件但對此物件的某些部分會被變更卻又想...

原型模式 建立型模式

文章首發個人部落格 如果我們有乙個類 sheep 它裡面有兩個屬性,名稱 name 年齡 age 現在我們有乙個它的例項 s1 我們需要按照這個例項的屬性再去建立兩個物件。1 sheep data public class sheep 2 main public class main 原型模式 用原...