傳統方式解決轉殖羊問題
**演示
需要複製的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方法
packagecom.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讓乙個原型物件轉殖自己
packagecom.wang.prototype.improve;
import
com.wang.prototype.improve.sheep;
public
class
client
}
<test.j**abean
id="id01"
class
="com.atguigu.spring.bean.monster"
scope
="prototype"
/>
//獲取monster[通過id獲取monster]
深入討論-淺拷貝和深拷貝
淺拷貝的介紹
1) 對於資料型別是基本資料型別的成員變數,淺拷貝會直接進行值傳遞,也就是將 該屬性值複製乙份給新的物件。
2) 對於資料型別是引用資料型別的成員變數,比如說成員變數是某個陣列、某個類 的物件等,那麼淺拷貝會進行引用傳遞,也就是只是將該成員變數的引用值(內 存位址)複製乙份給新的物件。因為實際上兩個物件的該成員變數都指向同乙個 例項。在這種情況下,在乙個物件中修改該成員變數會影響到另乙個物件的該成 員變數值
3) 前面我們轉殖羊就是淺拷貝
4) 淺拷貝是使用預設的 clone()方法來實現 sheep = (sheep) super.clone();
深拷貝基本介紹
1) 複製物件的所有基本資料型別的成員變數值
2) 為所有引用資料型別的成員變數申請儲存空間,並複製每個引用資料型別成員變 量所引用的物件,直到該物件可達的所有物件。也就是說,物件進行深拷貝要對 整個物件進行拷貝
3) 深拷貝實現方式1:重寫clone方法來實現深拷貝
深拷貝應用例項
1) 使用 重寫clone方法實現深拷貝
需要單獨clone的深拷貝引用物件
package原型物件deepprototype(包含引用物件)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() ';}}
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 原型模式 用原...