日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

設(shè)計(jì)模式學(xué)習(xí)之原型模式(Prototype,創(chuàng)建型模式)(5)

 昵稱10504424 2014-01-23

在開發(fā)中如果我們希望快速的創(chuàng)建一個(gè)對(duì)象,并且該對(duì)象和原有的對(duì)象擁有相同的數(shù)據(jù),并且和原有的對(duì)象不相干,那么我們就可以這樣做

第一步:

假如我需要快速創(chuàng)建一個(gè)Person對(duì)象,然后和某個(gè)Person對(duì)象相同,如果我們我們只需要Person對(duì)象中的屬性不引用其他數(shù)據(jù)信息,可以使用淺拷貝;

如果我們需要Person對(duì)象中所有的信息,包括引用的數(shù)據(jù)信息,可以使用深拷貝

第二步:

在Person類中實(shí)現(xiàn)Cloneable接口,重寫clone()方法,如果是淺拷貝,只需要直接調(diào)用父類的clone()方法就行,如果是深拷貝,需要在clone()方法中重新開辟引用字段所需的內(nèi)存

代碼如下:

Person.java

MainClass.java

復(fù)制代碼
package com.designpattern.prototype;

import java.util.ArrayList;
import java.util.List;

public class MainClass {

    public static void main(String[] args) {
        //假如我需要快速創(chuàng)建一個(gè)Person對(duì)象,然后和某個(gè)Person對(duì)象相同,如果我們我們只需要Person對(duì)象中的屬性不引用其他數(shù)據(jù)信息,可以使用淺拷貝
        //如果我們需要Person對(duì)象中所有的信息,包括引用的數(shù)據(jù)信息,可以使用深拷貝
        /*
         * 淺拷貝
         */
//        Person person = new Person();
//        person.setName("jack");
//        person.setAge(18);
//        
//        Person person2 = person.clone();//相當(dāng)于重新開辟一塊內(nèi)存空間,和person互不干擾
//        person2.setName("jack1");
//        
//        System.out.println(person.getName());
//        System.out.println(person2.getName());
        
        Person person = new Person();
        person.setName("jack");
        person.setAge(18);
        List<String> friends = new ArrayList<String>();
        friends.add("p1");
        friends.add("p2");
        person.setFriends(friends);
        
        Person person2 = person.clone();
        person2.setName("jack1");
        friends.add("p3");//person 引用friends,friends改變,person的friends就會(huì)改變,如果用淺拷貝,person2也會(huì)跟著改變
        //如果用深拷貝,person2不會(huì)跟著改變,因?yàn)閜erson2的friends和person的friends沒(méi)有指向同一塊內(nèi)存
        
        
        System.out.println(person.getName());
        System.out.println(person2.getName());
        System.out.println(person.getFriends());
        System.out.println(person2.getFriends());
    }

}
復(fù)制代碼

一、什么是原型模式

Prototype模式是一種對(duì)象創(chuàng)建型模式,它采取復(fù)制原型對(duì)象的方法來(lái)創(chuàng)建對(duì)象的實(shí)例。使用Prototype模式創(chuàng)建的實(shí)例,具有與原型一樣的數(shù)據(jù)。

二、原型模式的特點(diǎn)

1. 由原型對(duì)象自身創(chuàng)建目標(biāo)對(duì)象。也就是說(shuō),對(duì)象創(chuàng)建這一動(dòng)作發(fā)自原型對(duì)象本身。

2.目標(biāo)對(duì)象是原型對(duì)象的一個(gè)克隆。也就是說(shuō),通過(guò)Prototype模式創(chuàng)建的對(duì)象,不僅僅與原型對(duì)象具有相同的結(jié)構(gòu),還與原型對(duì)象具有相同的值。

3.根據(jù)對(duì)象克隆深度層次的不同,有淺度克隆與深度克隆。

三、原型模式應(yīng)用場(chǎng)景

- 在創(chuàng)建對(duì)象的時(shí)候,我們不只是希望被創(chuàng)建的對(duì)象繼承其基類的基本結(jié)構(gòu),還希望繼承原型對(duì)象的數(shù)據(jù)。

- 希望對(duì)目標(biāo)對(duì)象的修改不影響既有的原型對(duì)象(深度克隆的時(shí)候可以完全互不影響)。

- 隱藏克隆操作的細(xì)節(jié)。很多時(shí)候,對(duì)對(duì)象本身的克隆需要涉及到類本身的數(shù)據(jù)細(xì)節(jié)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多