真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

【設(shè)計(jì)模式與Android】原型模式——復(fù)制中心走出來的克隆人

什么是原型模式

站在用戶的角度思考問題,與客戶深入溝通,找到龍沙網(wǎng)站設(shè)計(jì)與龍沙網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋龍沙地區(qū)。

 

所謂原型模式,就是用原型實(shí)例來指定創(chuàng)建對(duì)象的種類,并通過復(fù)制這些原型創(chuàng)建新的對(duì)象的設(shè)計(jì)模式。原型模式一般用于創(chuàng)建復(fù)雜的或者構(gòu)建耗時(shí)的實(shí)例,或者用于只讀對(duì)象的修改。

 

原型模式的實(shí)現(xiàn)方式

 

(1)淺拷貝

當(dāng)代的每個(gè)程序員小時(shí)候都玩過《尤里的復(fù)仇》這款游戲,游戲中的“尤里”陣營(yíng)有個(gè)兵種叫“尤里復(fù)制人”,每個(gè)尤里復(fù)制人都和尤里長(zhǎng)得一模一樣,除了沒有坐騎之外。

public classYuri{

    privateStringname="Yuri";

    privateArrayListwords=newArrayList<>();

    public voidsetName(String name) {
        this.name= name;
    }

    public voidaddWord(String word){
        this.words.add(word);
    }

    @Override
    protectedYuri clone(){
        try{
            return(Yuri)super.clone();
        }catch(CloneNotSupportedException e){
            return null;
        }
    }

    @Override
    publicString toString() {
        return"Yuri{"+
                "name='"+name+'\''+
                ", words="+words.toString() +
                '}';
    }
}

 

如上,重寫了clone()方法。在執(zhí)行如下代碼時(shí):

Yuri yuri =newYuri();
yuri.setName("Yuri");
yuri.addWord("My name is Yuri");
yuri.addWord("You mind is clear");

Yuri yuri_copyer = yuri.clone();
yuri.setName("Yuri's copyer");

yuri.addWord("I'm not the only one true Yuri");



Log.e("yuri_copyer",yuri_copyer.toString());
Log.e("yuri",yuri.toString());

會(huì)驚奇地發(fā)現(xiàn)兩行Log一模一樣,這是因?yàn)檫@種原型模式的實(shí)現(xiàn)方式只拷貝其引用,換句話說就是并沒有將原型對(duì)象中的所有字段都重新構(gòu)造一份,只是用復(fù)制對(duì)象的字段引用原型對(duì)象中的字段,因此被稱為“淺拷貝”或“影子拷貝”。

 

(2)深拷貝

我們把上文的clone()方法修改一下:

@Override
protectedYuri clone(){
    try{
        Yuri copyer = (Yuri)super.clone();
        copyer.name=this.name;
        copyer.words= (ArrayList)this.words.clone();
        returncopyer;
    }catch(CloneNotSupportedException e){
        return null;
    }
}

 

如上,這種實(shí)現(xiàn)方式調(diào)用了的clone()方法,這樣可以保證副本被修改時(shí)不影響原始對(duì)象,因此被稱為“深拷貝”,又叫做“保護(hù)性拷貝”。

 

Android源碼中的原型模式

 

(1)ArrayList

嚴(yán)格來說ArrayList并不算是Android源碼中的類,但應(yīng)該是Android開發(fā)者最常用的類,ArrayList的clone()代碼如下:

/**
 * Returns a shallow copy of thisArrayList instance.  (The
 * elements themselves are not copied.)
 *
 *@returna clone of thisArrayList instance
 */
publicObject clone() {
    try{
        ArrayList v = (ArrayList)super.clone();
        v.elementData = Arrays.copyOf(elementData,size);
        v.modCount=0;
        returnv;
    }catch(CloneNotSupportedException e) {
        // this shouldn't happen, since we are Cloneable
        throw newInternalError(e);
    }
}

 

大家可以看到size并沒有被clone,因?yàn)閟ize是基礎(chǔ)類型而不是引用類型,所以不需要clone。細(xì)心的讀者可以看到注釋里面的“shallow copy”,但這實(shí)際上是一個(gè)典型的深拷貝。

 

(3)Intent

Android系統(tǒng)加入Intent機(jī)制的意義在于大大降低了Android四大組件之間的耦合度。Intent的clone()代碼如下:

@Override
publicObject clone() {
    return newIntent(this);
}

 

/**
 * Copy constructor.
 */
publicIntent(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=newArraySet(o.mCategories);
    }
    if(o.mExtras !=null) {
        this.mExtras=newBundle(o.mExtras);
    }
    if(o.mSourceBounds !=null) {
        this.mSourceBounds=newRect(o.mSourceBounds);
    }
    if(o.mSelector !=null) {
        this.mSelector=newIntent(o.mSelector);
    }
    if(o.mClipData !=null) {
        this.mClipData=newClipData(o.mClipData);
    }
}

 

Intent的clone()內(nèi)部并沒有調(diào)用super.clone(),而是調(diào)用了new Intent(this)。

 

Android開發(fā)中如何利用原型模式

 

(1)Object的clone()方法直接操作二進(jìn)制流,效率非常高。在對(duì)象的初始化要消耗非常多的資源時(shí),或者用new來實(shí)例化一個(gè)對(duì)象時(shí)需要非常繁瑣的數(shù)據(jù)準(zhǔn)備或訪問權(quán)限時(shí),可以使用原型模式提高效率、避免消耗資源。

 

(2)對(duì)深拷貝生成的副本進(jìn)行修改不會(huì)影響原始對(duì)象。當(dāng)一個(gè)對(duì)象會(huì)被不同對(duì)象用不同方式修改時(shí),可以用原型模式產(chǎn)生副本供調(diào)用者使用。

 

需要注意的幾個(gè)問題

 

(1)原型模式在clone()的時(shí)候不會(huì)重新執(zhí)行構(gòu)造函數(shù),可能會(huì)出現(xiàn)問題。

 

(2)在某些對(duì)象構(gòu)造非常簡(jiǎn)單的情況下,比如上文提到的Intent,重新new一個(gè)比clone()快,因此不要濫用原型模式

本系列其他博客

 

【設(shè)計(jì)模式與Android】工廠方法模式——化工女神的工廠

【設(shè)計(jì)模式與Android】抽象工廠模式——嵌合體克隆工廠

【設(shè)計(jì)模式與Android】策略模式——錦囊里的上策中策下策

【設(shè)計(jì)模式與Android】狀態(tài)模式——一個(gè)人的兩幅面孔

【設(shè)計(jì)模式與Android】責(zé)任鏈模式——曹瞞兵敗走華容


網(wǎng)頁(yè)題目:【設(shè)計(jì)模式與Android】原型模式——復(fù)制中心走出來的克隆人
標(biāo)題鏈接:http://weahome.cn/article/pjhgpi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部