最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計模式中的原型模式講解

 更新時間:2023年04月27日 08:37:19   作者:.番茄炒蛋  
原型模式是用于創(chuàng)建重復(fù)的對象,同時又能保證性能。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式,今天通過本文給大家介紹下Java?原型設(shè)計模式,感興趣的朋友一起看看吧

介紹

原型模式

在Java中,原型模式是一種創(chuàng)建型設(shè)計模式,它允許通過復(fù)制一個現(xiàn)有對象來創(chuàng)建一個新對象,而不是通過創(chuàng)建新的對象來初始化一個對象,原型模式是一種基于克隆的設(shè)計模式,通過復(fù)制現(xiàn)有對象的數(shù)據(jù)來創(chuàng)建新的對象.

原型模式需要實現(xiàn)Cloneable接口并重寫Object類中的clone()方法,在重謝clone()方法時,需要調(diào)用super.clone()方法來創(chuàng)建一個新的對象,并復(fù)制原始對象中的所有屬性.默認(rèn)情況下,Java中的Object類提供的clone()方法會執(zhí)行淺拷貝,如果原始對象中包含引用類型的成員變量,則需要進(jìn)行深拷貝操作,以確保新對象中所有成員變量都是獨立的.

深拷貝與淺拷貝

淺拷貝(Shallow Copy)會創(chuàng)建一個新的對象,該對象具有與原始對象相同的屬性值.但是,如果原始對象包含對其他對象的引用,則新對象也將包含對相同對象的引用.換句話說,新對象僅僅是原始對象的一個副本,而不是獨立的對象.

深拷貝(Deep Copy)則是創(chuàng)建一個新的對象,該對象具有與原始對象相同的屬性值,但是它會遞歸的復(fù)制對象圖中所有的對象,而不是只復(fù)制引用.換句話說,深拷貝會創(chuàng)建一個完全獨立的新對象,該對象與原始對象沒有任何關(guān)聯(lián).

區(qū)別:

  • 對于基本數(shù)據(jù)類型,淺拷貝和深拷貝沒有區(qū)別,因為基本數(shù)據(jù)類型在內(nèi)存中儲存為值.但是對于引用類型,淺拷貝和深拷貝會有不同的行為.淺拷貝只復(fù)制對象本身以及其中的基本數(shù)據(jù)類型成員,而不會復(fù)制引用類型成員.因此,如果原始對象中包含引用類型成員,淺拷貝得到的對象中的引用類型成員與原始對象中的相同,即兩者指向同一塊內(nèi)存地址.而深拷貝則會遞歸的復(fù)制所有的引用類型成員,因此得到的對象中的引用類型成員與原始對象中的不同,即兩者指向不同的內(nèi)存地址.
  • 淺拷貝速度相對較快,因為它只復(fù)制了對象本身以及其中的基本數(shù)據(jù)類型成員.而深拷貝速度相對較慢,因為它需要遞歸的復(fù)制所有引用類型成員.

應(yīng)用場景:

  • 淺拷貝通常用于快速創(chuàng)建對象副本,且原始對象中不包含引用類型成員的情況下,可以使用淺拷貝.比如,當(dāng)需要多個對象共享某些狀態(tài)時,可以使用淺拷貝來快速創(chuàng)建副本
  • 深拷貝通常用于創(chuàng)建完全獨立的對象,且原始對象中包含引用類型成員的情況下,可以使用深拷貝

淺拷貝示例代碼

@Data
public class Person implements Cloneable{
    private String name;
    private int age;
    private Address address;
    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
@Data
public class Address {
    private String city;
    private String street;
    public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }
}

測試淺拷貝

package com.fanqiechaodan.prototype.copy.shollow;
import com.alibaba.fastjson.JSON;
/**
 * @Classname Demo
 * @Description 淺拷貝
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person("張三", 18, new Address("上海", "南京路"));
        Person person2 = (Person) person1.clone();
        System.out.println(JSON.toJSONString(person1));
        System.out.println(JSON.toJSONString(person2));
        System.out.println("淺拷貝后:");
        person1.getAddress().setCity("南京");
        System.out.println(JSON.toJSONString(person1));
        System.out.println(JSON.toJSONString(person2));
    }
}

深拷貝示例代碼

@Data
public class Person implements Serializable {
    private String name;
    private int age;
    private Address address;
    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }
    @Override
    protected Object clone() {
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            return ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}
@Data
public class Address implements Serializable {
    private String city;
    private String street;
    public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }
}

測試深拷貝

package com.fanqiechaodan.prototype.copy.deep;
import com.alibaba.fastjson.JSON;
import org.springframework.util.SerializationUtils;
import java.io.IOException;
/**
 * @Classname Demo
 * @Description 深拷貝
 */
public class Demo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Person person1 = new Person("張三", 18, new Address("上海", "南京路"));
        // 重寫clone完成深拷貝
        Person person2 = (Person) person1.clone();
        // 使用工具類完成深拷貝
        Person person3 = (Person) SerializationUtils.deserialize(SerializationUtils.serialize(person1));
        System.out.println(JSON.toJSONString(person1));
        System.out.println(JSON.toJSONString(person2));
        System.out.println(JSON.toJSONString(person3));
        System.out.println("深拷貝后:");
        person1.getAddress().setCity("南京");
        System.out.println(JSON.toJSONString(person1));
        System.out.println(JSON.toJSONString(person2));
        System.out.println(JSON.toJSONString(person3));
    }
}

原型模式代碼

原型類代碼

@Data
public class Person implements Cloneable{
    private String name;
    private int age;
    private Address address;
    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
@Data
public class Address {
    private String city;
    private String street;
    public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }
}

測試

package com.fanqiechaodan.prototype;
import com.alibaba.fastjson.JSON;
/**
 * @Classname Demo
 * @Description
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person("張三", 18, new Address("北京", "青年路"));
        Person person2 = (Person) person1.clone();
        System.out.println(JSON.toJSONString(person1));
        System.out.println(JSON.toJSONString(person2));
    }
}

需要注意的是,在使用Cloneable接口實現(xiàn)原型模式時,需要注意以下幾點:

  • 要使用克隆方法,必須確保該對象實現(xiàn)了Cloneable接口.否則,在調(diào)用clone方法時會拋出CloneNotSupportedException異常
  • 調(diào)用clone方法返回的是一個淺拷貝對象,如果對象包含了引用類型的成員變量,那么這些成員變量依然會被多個對象共享.
  • 在實現(xiàn)clone方法時,需要注意對成員變量的處理,特別是對引用類型的成員變量的處理.如果需要實現(xiàn)深拷貝,可以通過重寫clone方法來實現(xiàn).

總結(jié)

優(yōu)點:

  • 減少了重復(fù)代碼的編寫,避免了創(chuàng)建大量相似對象的開銷,提高了系統(tǒng)的性能.
  • 可以動態(tài)的創(chuàng)建對象,而不是靜態(tài)地在代碼中定義,更加靈活.
  • 簡化了對象的創(chuàng)建過程,減少了不必要的參數(shù)傳遞.

缺點:

  • 由于原型模式會復(fù)制對象,可能導(dǎo)致對象狀態(tài)的改變,因此需要謹(jǐn)慎處理.
  • 由于原型模式使用了克隆的方式創(chuàng)建對象,可能導(dǎo)致類的層次結(jié)構(gòu)比較復(fù)雜.

應(yīng)用場景:

  • 當(dāng)需要創(chuàng)建大量相似的對象時,使用原型模式可以大大減少對象創(chuàng)建的開銷.
  • 當(dāng)對象的創(chuàng)建過程比較復(fù)雜,或者對象的狀態(tài)會隨著時間的推移而發(fā)生改變時,可以考慮使用原型模式.
  • 當(dāng)需要動態(tài)地創(chuàng)建對象時,可以使用原型模式.例如:在運行時動態(tài)創(chuàng)建新對象或者在數(shù)據(jù)庫中讀取對象并創(chuàng)建新對象.

到此這篇關(guān)于Java設(shè)計模式中的原型模式講解的文章就介紹到這了,更多相關(guān)Java原型設(shè)計模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring boot整合mybatis利用Mysql實現(xiàn)主鍵UUID的方法

    spring boot整合mybatis利用Mysql實現(xiàn)主鍵UUID的方法

    這篇文章主要給大家介紹了關(guān)于spring boot整合mybatis利用Mysql實現(xiàn)主鍵UUID的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Guava輕松創(chuàng)建和管理不可變集合方法技巧

    Guava輕松創(chuàng)建和管理不可變集合方法技巧

    這篇文章主要為大家介紹了Guava輕松創(chuàng)建和管理不可變集合方法技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java多線程 CompletionService

    Java多線程 CompletionService

    這篇文章主要介紹了Java多線程 CompletionService,CompletionService用于提交一組Callable任務(wù),其take方法返回已完成的一個Callable任務(wù)對應(yīng)的Future對象,需要的朋友可以參考一下文章詳細(xì)內(nèi)容
    2021-10-10
  • java解析Excel的方法(xls、xlsx兩種格式)

    java解析Excel的方法(xls、xlsx兩種格式)

    這篇文章主要介紹了java解析Excel的方法(xls、xlsx兩種格式),需要的朋友可以參考下
    2018-04-04
  • Java 手寫LRU緩存淘汰算法

    Java 手寫LRU緩存淘汰算法

    本文主要講了如何通過哈希鏈表這種數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)LRU算法,提供了三種實現(xiàn)思路,第一種從雙向鏈表開始,借助于HashMap來實現(xiàn)滿足要求的LRUCache
    2021-05-05
  • Java定時任務(wù)的三種實現(xiàn)方法

    Java定時任務(wù)的三種實現(xiàn)方法

    在應(yīng)用里經(jīng)常都有用到在后臺跑定時任務(wù)的需求。舉個例子,比如需要在服務(wù)后臺跑一個定時任務(wù)來進(jìn)行垃圾回收
    2014-04-04
  • Java正則之貪婪匹配、惰性匹配

    Java正則之貪婪匹配、惰性匹配

    這篇文章主要介紹了Java正則之貪婪匹配、惰性匹配的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • Java 文件上傳與路徑處理之Paths.get()、resolve()、transferTo()的用法詳解

    Java 文件上傳與路徑處理之Paths.get()、resolve()、transferTo()的用法詳解

    本文詳細(xì)解析了如何使用Java的Paths.get()、resolve()和Spring的transferTo()方法處理文件上傳功能,并給出了完整的代碼示例,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • Java利用StampedLock實現(xiàn)讀寫鎖的方法詳解

    Java利用StampedLock實現(xiàn)讀寫鎖的方法詳解

    在jdk8以后,java提供了一個性能更優(yōu)越的讀寫鎖并發(fā)類StampedLock,該類的設(shè)計初衷是作為一個內(nèi)部工具類,用于輔助開發(fā)其它線程安全組件。本文就來和大家一起學(xué)習(xí)下StampedLock的功能和使用
    2022-10-10
  • Vue.Js及Java實現(xiàn)文件分片上傳代碼實例

    Vue.Js及Java實現(xiàn)文件分片上傳代碼實例

    這篇文章主要介紹了Vue.Js及Java實現(xiàn)文件分片上傳代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06

最新評論

郁南县| 从江县| 麟游县| 巨野县| 宿州市| 奉节县| 隆德县| 永城市| 临夏市| 石家庄市| 台湾省| 灯塔市| 于都县| 苍南县| 通山县| 柳江县| 屯留县| 富蕴县| 大荔县| 天峨县| 肥城市| 庄河市| 常德市| 长乐市| 张家口市| 莒南县| 浠水县| 滦平县| 天峨县| 九龙县| 精河县| 驻马店市| 察雅县| 如东县| 宝清县| 个旧市| 昭平县| 社旗县| 江山市| 灌云县| 营口市|