設(shè)計(jì)模式原型模式

1.原型模式的定義及使用場景
定義:
用原型實(shí)例指定創(chuàng)建對象的種類嚣崭,并通過拷貝這些原型創(chuàng)建新的對象
使用場景:
類初始化需要消耗非常多的資源笨触,這個資源包括數(shù)據(jù)、硬件資源等雹舀,通過原型拷貝避免這些消耗
通過new產(chǎn)生一個對象需要非常繁瑣的數(shù)據(jù)準(zhǔn)備或訪問權(quán)限芦劣,這時(shí)可以使用原型模式
一個對象需要提供給其他對象訪問,而且各個調(diào)用者可能都需要修改其值時(shí)说榆,可以考慮使用原型模式拷貝多個對象供調(diào)用者使用虚吟,即保護(hù)性拷貝

Paste_Image.png

2.原型模式的優(yōu)缺點(diǎn)
2.1優(yōu)點(diǎn)
性能優(yōu)良原型模式是在內(nèi)存二進(jìn)制流的拷貝,要比直接new一個對象性能好签财,特別是要在一個循環(huán)體內(nèi)產(chǎn)生大量的對象時(shí)串慰,原型模式可以更好地體現(xiàn)其優(yōu)點(diǎn)
2.2缺點(diǎn)
逃避構(gòu)造函數(shù)的約束這既是他的優(yōu)點(diǎn)也是缺點(diǎn),直接在內(nèi)存中拷貝唱蒸,構(gòu)造函數(shù)不會執(zhí)行邦鲫。需要在實(shí)際應(yīng)用時(shí)考慮
3.注意實(shí)現(xiàn)
構(gòu)造函數(shù)默認(rèn)不執(zhí)行
淺拷貝及深拷貝
Object類提供的方法clone只是拷貝本對象,其對象內(nèi)部的數(shù)組神汹、引用對象等都不拷貝庆捺,還是指向原型對象的內(nèi)部元素地址,這種拷貝為淺拷貝屁魏。如需要深拷貝疼燥,對應(yīng)的成員也需指向clone方法
要使用clone方法,類的成員變量上不要增加final關(guān)鍵字
4.原型模式的實(shí)現(xiàn)方式

ProtoType:

public class ProtoType implements Cloneable {  
  
  
    public ProtoType() {  
        System.out.println("ProtoType is excute...");  
    }  
  
  
    private int id;  
    private String name;  
  
  
    public int getId() {  
        return id;  
    }  
  
  
    public void setId(int id) {  
        this.id = id;  
    }  
  
  
    public String getName() {  
        return name;  
    }  
  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
  
    @Override  
    protected ProtoType clone() {  
        ProtoType protoType = null;  
        try {  
            protoType = (ProtoType) super.clone();  
        } catch (CloneNotSupportedException e) {  
            e.printStackTrace();  
        }  
        return protoType;  
    }  
  
  
    @Override  
    public String toString() {  
        return "ProtoType{" +  
                "id=" + id +  
                ", name='" + name + '\'' +  
                '}';  
    }  
}```
Text:

public class Test {

public static void main(String args[]) {  
    ProtoType type = new ProtoType();  
    type.setId(1);  
    type.setName("張三");  
    System.out.println(type);  
    ProtoType clone = type.clone();  
    clone.setId(2);  
    clone.setName("李四");  
    System.out.println(clone);  
}  

}```
Objec的clone源碼:

/** 
* Creates and returns a copy of this {@code Object}. The default 
* implementation returns a so-called "shallow" copy: It creates a new 
* instance of the same class and then copies the field values (including 
* object references) from this instance to the new instance. A "deep" copy, 
* in contrast, would also recursively clone nested objects. A subclass that 
* needs to implement this kind of cloning should call {@code super.clone()} 
* to create the new instance and then create deep copies of the nested, 
* mutable objects. 
* 
* @return a copy of this object. 
* @throws CloneNotSupportedException 
* if this object's class does not implement the {@code 
* Cloneable} interface. 
*/  
protected Object clone() throws CloneNotSupportedException {  
if (!(this instanceof Cloneable)) {  
throw new CloneNotSupportedException("Class " + getClass().getName() +  
" doesn't implement Cloneable");  
}  
return internalClone();  
}  
/* 
* Native helper method for cloning. 
*/  
private native Object internalClone();```
可見執(zhí)行了一個native方法執(zhí)行二進(jìn)制流的拷貝
**5.原型模式在Android中的實(shí)際應(yīng)用**
Intent:

@Override
public Object clone() {
return new Intent(this);
}

/**

  • Copy constructor.
    */
    public Intent(Intent o) {
    this.mAction = o.mAction;
    this.mData = o.mData;
    this.mType = o.mType;
    this.mPackage = o.mPackage;
    this.mComponent = o.mComponent;
    this.mFlags = o.mFlags;
    this.mContentUserHint = o.mContentUserHint;
    if (o.mCategories != null) {
    this.mCategories = new ArraySet<String>(o.mCategories);
    }
    if (o.mExtras != null) {
    this.mExtras = new Bundle(o.mExtras);
    }
    if (o.mSourceBounds != null) {
    this.mSourceBounds = new Rect(o.mSourceBounds);
    }
    if (o.mSelector != null) {
    this.mSelector = new Intent(o.mSelector);
    }
    if (o.mClipData != null) {
    this.mClipData = new ClipData(o.mClipData);
    }
    }```
    出處:http://huangjunbin.com/page/2/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚁堤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌披诗,老刑警劉巖撬即,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呈队,居然都是意外死亡剥槐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門宪摧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粒竖,“玉大人,你說我怎么就攤上這事几于∪锩纾” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵沿彭,是天一觀的道長朽砰。 經(jīng)常有香客問我,道長喉刘,這世上最難降的妖魔是什么瞧柔? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮睦裳,結(jié)果婚禮上造锅,老公的妹妹穿的比我還像新娘。我一直安慰自己廉邑,他們只是感情好哥蔚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鬓催,像睡著了一般肺素。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宇驾,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天倍靡,我揣著相機(jī)與錄音,去河邊找鬼课舍。 笑死塌西,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筝尾。 我是一名探鬼主播捡需,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼筹淫!你這毒婦竟也來了站辉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饰剥,沒想到半個月后殊霞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汰蓉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年绷蹲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顾孽。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡祝钢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出若厚,到底是詐尸還是另有隱情拦英,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布盹沈,位于F島的核電站龄章,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乞封。R本人自食惡果不足惜做裙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肃晚。 院中可真熱鬧锚贱,春花似錦、人聲如沸关串。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晋修。三九已至吧碾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間墓卦,已是汗流浹背倦春。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留落剪,地道東北人睁本。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像忠怖,于是被迫代替她去往敵國和親呢堰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

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

  • 前言 Android的設(shè)計(jì)模式系列文章介紹凡泣,歡迎關(guān)注枉疼,持續(xù)更新中: Android的設(shè)計(jì)模式-設(shè)計(jì)模式的六大原則一...
    四月葡萄閱讀 5,566評論 4 10
  • 原型模式 介紹 在許多面向?qū)ο蟮膽?yīng)用程序中皮假,有些對象的創(chuàng)建代價(jià)過大或者過于復(fù)雜。要是可以重建相同的對象并作輕微的改...
    666真666閱讀 449評論 0 2
  • 定義 原型模式屬于對象的創(chuàng)建模式往衷。通過給出一個原型對象來指明所有創(chuàng)建的對象的類型钞翔,然后用復(fù)制這個原型對象的辦法創(chuàng)建...
    步積閱讀 1,347評論 0 2
  • 原文地址:LoveDev 原型模式是創(chuàng)建型模式的一種,其特點(diǎn)在于通過“復(fù)制”一個已經(jīng)存在的實(shí)例來返回新的實(shí)例席舍,而不...
    KevinLive閱讀 374評論 0 0
  • 時(shí)維丙申歲尾,朔風(fēng)頓起哮笆,驟寒突降来颤,灰云壓天,雹雪漸至稠肘,臨兆而發(fā)福铅。 憶昨日冰雪初下,霰急粉糅乎项阴,如沙粒擊臉滑黔,似玉質(zhì)著...
    方陽普閱讀 284評論 15 7