原型模式

基本介紹

定義

原型模式(Prototype Pattern):用原型實例指定創(chuàng)建對象的種類颂斜,并通過拷貝這些原型創(chuàng)建新的對象碉输。

使用場景

一個對象需要提供給其他對象訪問秫筏,而各個調(diào)用者都需要修改其值隘冲,可以利用原型模式賦值多個拷貝對象公其他調(diào)用者使用抵赢。

使用優(yōu)點

減少了類對象創(chuàng)建時的資源消耗欺劳。通過原型模式,直接操作內(nèi)存中的數(shù)據(jù)铅鲤,對于一些復(fù)雜對象的創(chuàng)建划提,大大減少了資源的消耗。

實現(xiàn)方式

首先看一下代碼

/**

*

* 原型模式

*

*/

public class Prototype implements Cloneable {

private String id;

private ArrayList?names;

public Prototype(String id, ArrayList names) {

this.id= id;

this.names= names;

}

// 拷貝方法

@Override

publicObject clone() {

Prototype prototype =null;

try{

// 調(diào)用Object的clone() 拷貝對象

prototype = (Prototype)super.clone();

}catch(CloneNotSupportedException e) {

e.printStackTrace();

}

// 返回拷貝的實例對象

returnprototype ;

}

publicString getId() {

returnid;

}

public voidsetId(String id) {

this.id= id;

}

publicArrayList getNames() {

returnnames;

}

public voidsetNames(ArrayList names) {

this.names= names;

}

@Override

publicString toString() {

return"Prototype{"+

"id='"+id+'\''+

", names="+names+

'}';

}

}

從代碼上看邢享,實現(xiàn)方式分為兩個步驟:

(1)實現(xiàn)Cloneable接口鹏往,該接口是一個空接口,沒有任何需要實現(xiàn)的方法骇塘。

(2)重寫clone()方法伊履,該方法重寫了Object的clone()方法。

在重寫clone()方法內(nèi)绪爸,直接調(diào)用了super.clone()獲取了對象的實例湾碎。

注意

通過clone()獲取的對象,不會調(diào)用該對象的構(gòu)造方法奠货。

使用方式

@Test

public voidtest_prototype(){

ArrayList names =newArrayList<>();

Prototype prototype =newPrototype("1",names);

// 拷貝對象

Prototype clone = (Prototype) prototype.clone();

System.out.println("********拷貝對象************");

System.out.println(clone);

// 對拷貝對象設(shè)置值

clone.getNames().add("Alex");

clone.setId("2");

// 看一下修改結(jié)果

System.out.println("********原對象************");

System.out.println(prototype);

System.out.println("********拷貝對象************");

System.out.println(clone);

}

使用方式很簡單介褥,直接調(diào)用prototype.clone()方法就獲取到了拷貝對象。根據(jù)分析递惋,拷貝對象修改數(shù)值不會影響到原對象柔滔,那么結(jié)果是這樣的嗎?

********拷貝對象************

Prototype{id='1', names=[]}

********原對象************

Prototype{id='1', names=[Alex]}

********拷貝對象************

Prototype{id='2', names=[Alex]}

通過對結(jié)果分析萍虽,發(fā)現(xiàn)id沒有收到影響睛廊,但names確收到了影響。為什么呢杉编?

如果對于方法傳參超全,形參和實參能夠理解的話,這個地方類似邓馒∷恢欤拷貝拷貝的是他們的值,而names的值時一個地址光酣,拷貝對象也是該地址疏遏,那么修改該地址的值,兩者都會改變。那么這種拷貝稱之為淺拷貝财异。

既然有淺拷貝倘零,那么肯定有深拷貝:

只需要我們實現(xiàn)clone()方法的地方修改代碼

// 拷貝方法

@Override

publicObject clone() {

Prototype prototype =null;

try{

// 調(diào)用Object的clone() 拷貝對象

prototype = (Prototype)super.clone();

// 一些集合類都默認(rèn)實現(xiàn)了clone()方法

prototype.names = (ArrayList)this.names.clone();

}catch(CloneNotSupportedException e) {

e.printStackTrace();

}

// 返回拷貝的實例對象

returnprototype ;

}

添加了代碼prototype.names = (ArrayList) this.names.clone();,幸運的是Java提供的大部分的容器類都實現(xiàn)了Cloneable接口戳寸。

看一下結(jié)果

********拷貝對象************

Prototype{id='1', names=[]}

********原對象************

Prototype{id='1', names=[]}

********拷貝對象************

Prototype{id='2', names=[Alex]}

在Android中的應(yīng)用

Android開發(fā)中呈驶,通常會在Application中保存全局的User對象,該對象在某些時候便于操作庆揩,如下所示

**

*? 自定義Application

* Created by alex_mahao on2016/8/30.

*/

public classAppextendsApplication {

// 保存user對象

privateUseruser;

@Override

public voidonCreate() {

super.onCreate();

}

// 設(shè)置user對象

public voidsetUser(User user){

user =this.user;

}

publicUser getUser(){

returnuser;

}

}

而在業(yè)務(wù)中俐东,可能會有一些修改User對象的操作,例如修改用戶名订晌,密碼等,我們可以自己new一個對象蚌吸,對對象進(jìn)行必要的賦值之后锈拨,通過網(wǎng)絡(luò)請求傳輸過去,那么現(xiàn)在我們可以通過clone的方式進(jìn)行修改羹唠。

首先看一下User對象的定義

/**

*? 自定義Application

* Created by alex_mahao on 2016/8/30.

*/

public classAppextendsApplication {

// 保存user對象

privateUseruser;

@Override

public voidonCreate() {

super.onCreate();

}

// 設(shè)置user對象

public voidsetUser(User user){

user =this.user;

}

}

那么在進(jìn)行網(wǎng)絡(luò)請求修改密碼時:

User user = app.getUser().clone();

// post 請求

post(url,toJson(user),newCallback{

public voidonSuccess(){

// 成功的回調(diào)

app.setUser(user);

}

public voidonFail(){

// 失敗的回調(diào)奕枢,不做任何操作

}

});

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市佩微,隨后出現(xiàn)的幾起案子缝彬,更是在濱河造成了極大的恐慌,老刑警劉巖哺眯,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谷浅,死亡現(xiàn)場離奇詭異,居然都是意外死亡奶卓,警方通過查閱死者的電腦和手機(jī)一疯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夺姑,“玉大人墩邀,你說我怎么就攤上這事≌嫡悖” “怎么了眉睹?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長废膘。 經(jīng)常有香客問我竹海,道長,這世上最難降的妖魔是什么殖卑? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任站削,我火速辦了婚禮,結(jié)果婚禮上孵稽,老公的妹妹穿的比我還像新娘许起。我一直安慰自己十偶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布园细。 她就那樣靜靜地躺著惦积,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猛频。 梳的紋絲不亂的頭發(fā)上狮崩,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音鹿寻,去河邊找鬼睦柴。 笑死,一個胖子當(dāng)著我的面吹牛毡熏,可吹牛的內(nèi)容都是我干的坦敌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痢法,長吁一口氣:“原來是場噩夢啊……” “哼狱窘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起财搁,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蘸炸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尖奔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搭儒,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年越锈,在試婚紗的時候發(fā)現(xiàn)自己被綠了仗嗦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡甘凭,死狀恐怖稀拐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丹弱,我是刑警寧澤唬格,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布婚陪,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逆粹。R本人自食惡果不足惜赋朦,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一参咙、第九天 我趴在偏房一處隱蔽的房頂上張望叶沛。 院中可真熱鬧,春花似錦、人聲如沸恐仑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裳仆。三九已至腕让,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歧斟,已是汗流浹背纯丸。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留静袖,地道東北人觉鼻。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像队橙,于是被迫代替她去往敵國和親滑凉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容