亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2021年08月12日 16:29:16   作者:二當(dāng)家的白帽子  
這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之Prototype原型模式的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

什么是原始模型模式

通過(guò)給出一個(gè)原型對(duì)象指明所要?jiǎng)?chuàng)建的對(duì)象的類型,然后通過(guò)復(fù)制這個(gè)原型對(duì)象來(lái)獲取的更多的同類型的對(duì)象。

這讓我不由自主的想起克隆技術(shù),還記得克隆羊嗎?我們接下來(lái)講的內(nèi)容和克隆羊不能說(shuō)關(guān)系密切,只能說(shuō)毫無(wú)關(guān)系。

在這里插入圖片描述

設(shè)計(jì)模式和編程語(yǔ)言無(wú)關(guān),但是二當(dāng)家的依然用Java語(yǔ)言去實(shí)戰(zhàn)舉例。而且Java有標(biāo)準(zhǔn)的實(shí)現(xiàn)原始模型模式的方法。

原始模型模式中的角色

img

Prototype:抽象類或者一個(gè)接口,給出具體模型需要的接口。ConcretePrototype:繼承抽象原型模型角色,被復(fù)制的對(duì)象。Client:提出復(fù)制請(qǐng)求。

抽象原型角色(Prototype)

我們用家庭作業(yè)為抽象原型角色(Prototype)。我們這里的作業(yè)是可以抄的。大家不要學(xué)哈。

package com.secondgod.prototype;
/**
 * 作業(yè)
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public interface IHomework {
    /**
     * 抄一份
     * @return
     */
    IHomework copy();
    /**
     * 修改所有者
     * @param owner
     */
    void setOwner(String owner);
}

具體原型角色(ConcretePrototype)

我們用語(yǔ)文作業(yè)作為具體原型角色(ConcretePrototype)。

package com.secondgod.prototype;
import java.text.MessageFormat;
/**
 * 語(yǔ)文作業(yè)
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public class ChineseHomework implements IHomework {
    /**
     * 作業(yè)的所有者
     */
    private String owner;
    /**
     * 作業(yè)標(biāo)題/作業(yè)要求
     */
    private String title;
    /**
     * 作業(yè)內(nèi)容
     */
    private String content;
    public ChineseHomework(String owner, String title, String content) {
        this.owner = owner;
        this.title = title;
        this.content = content;
    }
    public String getOwner() {
        return owner;
    }
    public void setOwner(String owner) {
        this.owner = owner;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String toString() {
        return MessageFormat.format("owner:{0},title:{1},content:{2}", owner, title, content);
    }
    @Override
    public IHomework copy() {
        ChineseHomework homework = new ChineseHomework(this.getOwner(), this.getTitle(), this.getContent());
        return homework;
    }
}

客戶端角色(Client)

我們測(cè)試一下。

package com.secondgod.prototype;
/**
 * 測(cè)試原始模型
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Test {
    public static void main(String[] args) {
        // 老師讓寫作業(yè),大當(dāng)家按時(shí)完成
        IHomework homework = new ChineseHomework("大當(dāng)家的", "作文-最崇拜的人", "不瞞你們說(shuō),我最崇拜的是二當(dāng)家的");
        // 二當(dāng)家的沒(méi)按時(shí)完成,決定去抄大當(dāng)家的作業(yè)~
        IHomework newHomework = homework.copy();
        newHomework.setOwner("二當(dāng)家的");
        System.out.println(homework);
        System.out.println(newHomework);
    }
}

image-20210809135840702

和我們的預(yù)期一致

使用Java內(nèi)置機(jī)制實(shí)現(xiàn)原始模型模式

在Object類中有這樣一個(gè)方法,Java中所有的類都繼承自O(shè)bject類,也就是說(shuō)所有的類內(nèi)部都可以復(fù)制自己。但是卻不能直接調(diào)用別的類的克隆方法。也就是說(shuō)有統(tǒng)一的方式,但是默認(rèn)不可用。

在這里插入圖片描述

我們改一下語(yǔ)文作業(yè)類,使用clone方法去嘗試,克隆自己。

package com.secondgod.prototype;
import java.text.MessageFormat;
/**
 * 語(yǔ)文作業(yè)
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public class ChineseHomework implements IHomework {
    /**
     * 作業(yè)的所有者
     */
    private String owner;
    /**
     * 作業(yè)標(biāo)題/作業(yè)要求
     */
    private String title;
    /**
     * 作業(yè)內(nèi)容
     */
    private String content;
    public ChineseHomework(String owner, String title, String content) {
        this.owner = owner;
        this.title = title;
        this.content = content;
    }
    public String getOwner() {
        return owner;
    }
    public void setOwner(String owner) {
        this.owner = owner;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String toString() {
        return MessageFormat.format("owner:{0},title:{1},content:{2}", owner, title, content);
    }
    @Override
    public IHomework copy() {
        try {
            return (ChineseHomework) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

在這里插入圖片描述

這時(shí)候會(huì)報(bào)錯(cuò),因?yàn)槲覀冞€少做一件事。我們需要把語(yǔ)文作業(yè)類實(shí)現(xiàn)Cloneable接口,然而這個(gè)接口里沒(méi)有任何抽象方法,僅僅是一個(gè)標(biāo)記接口。這就像注解一樣,就是為了明確聲明可以克隆。

在這里插入圖片描述

實(shí)現(xiàn)接口后,則可以正確運(yùn)行。

package com.secondgod.prototype;
import java.text.MessageFormat;
/**
 * 語(yǔ)文作業(yè)
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public class ChineseHomework implements IHomework, Cloneable {
    /**
     * 作業(yè)的所有者
     */
    private String owner;
    /**
     * 作業(yè)標(biāo)題/作業(yè)要求
     */
    private String title;
    /**
     * 作業(yè)內(nèi)容
     */
    private String content;
    public ChineseHomework(String owner, String title, String content) {
        this.owner = owner;
        this.title = title;
        this.content = content;
    }
    public String getOwner() {
        return owner;
    }
    public void setOwner(String owner) {
        this.owner = owner;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String toString() {
        return MessageFormat.format("owner:{0},title:{1},content:{2}", owner, title, content);
    }
    @Override
    public IHomework copy() {
        try {
            return (ChineseHomework) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

在這里插入圖片描述

和我們自己實(shí)現(xiàn)copy效果一樣。clone是一個(gè)native方法,是交給本地實(shí)現(xiàn)的,通常是直接內(nèi)存拷貝。

淺拷貝和深拷貝

淺拷貝:創(chuàng)建一個(gè)新對(duì)象,然后將當(dāng)前對(duì)象的非靜態(tài)字段復(fù)制到該新對(duì)象,如果字段是值類型的,那么對(duì)該字段執(zhí)行復(fù)制;如果該字段是引用類型的話,則復(fù)制引用但不復(fù)制引用的對(duì)象。因此,原始對(duì)象及其副本引用同一個(gè)對(duì)象。

深拷貝:創(chuàng)建一個(gè)新對(duì)象,然后將當(dāng)前對(duì)象的非靜態(tài)字段復(fù)制到該新對(duì)象,無(wú)論該字段是值類型的還是引用類型,都復(fù)制獨(dú)立的一份。當(dāng)你修改其中一個(gè)對(duì)象的任何內(nèi)容時(shí),都不會(huì)影響另一個(gè)對(duì)象的內(nèi)容。

二當(dāng)家的理解方式是,淺拷貝就是僅拷貝當(dāng)前對(duì)象的內(nèi)容,深拷貝就是遞歸拷貝當(dāng)前對(duì)象和當(dāng)前對(duì)象的引用類型屬性的內(nèi)容,直到全部都是基本數(shù)據(jù)類型的屬性為止。另外,僅僅使用clone方法是淺拷貝。

package com.secondgod.prototype;/** * 測(cè)試原始模型 * * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/ */public class Test implements Cloneable {    private Field field;    public Field getField() {        return field;    }    public void setField(Field field) {        this.field = field;    }    public Test clone() throws CloneNotSupportedException {        return (Test) super.clone();    }    public static void main(String[] args) throws CloneNotSupportedException {        Test t = new Test();        t.setField(new Field());        Test cloneT = t.clone();        System.out.println(t == cloneT);        System.out.println(t.getField() == cloneT.getField());    }}class Field {}

在這里插入圖片描述

源對(duì)象和克隆出的新對(duì)象field屬性值是同一個(gè)對(duì)象。所以是淺拷貝。

怎么實(shí)現(xiàn)深拷貝

讓每個(gè)引用類型屬性內(nèi)部都重寫clone() 方法,然后需要對(duì)所有引用類型屬性都調(diào)用clone方法。

package com.secondgod.prototype;
/**
 * 測(cè)試原始模型
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Test implements Cloneable {
    private Field field;
    public Field getField() {
        return field;
    }
    public void setField(Field field) {
        this.field = field;
    }
    public Test clone() throws CloneNotSupportedException {
        return (Test) super.clone();
    }
    public static void main(String[] args) throws CloneNotSupportedException {
        Test t = new Test();
        t.setField(new Field());
        Test cloneT = t.clone();
        System.out.println(t == cloneT);
        System.out.println(t.getField() == cloneT.getField());
    }
}
class Field {
}

在這里插入圖片描述

這種方式需要遞歸每個(gè)引用類型的屬性,要把他們的類都實(shí)現(xiàn)深拷貝,只到僅有基本數(shù)據(jù)類型為止。

利用序列化,這是個(gè)偷懶的辦法。但是二當(dāng)家的覺(jué)得更安全,如果你確定是要深拷貝,使用該方式可以防止某處漏實(shí)現(xiàn)clone方法,而變成不完全的深拷貝。

package com.secondgod.prototype;
/**
 * 測(cè)試原始模型
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Test implements Cloneable {
    private Field field;
    public Field getField() {
        return field;
    }
    public void setField(Field field) {
        this.field = field;
    }
    public Test clone() throws CloneNotSupportedException {
        return (Test) super.clone();
    }
    public Test deepClone() throws CloneNotSupportedException {
        Test t = new Test();
        t.setField(this.getField().deepClone());
        return t;
    }
    public static void main(String[] args) throws CloneNotSupportedException {
        Test t = new Test();
        t.setField(new Field());
        Test cloneT = t.clone();
        System.out.println(t == cloneT);
        System.out.println(t.getField() == cloneT.getField());
        Test deepCloneT = t.deepClone();
        System.out.println(t == deepCloneT);
        System.out.println(t.getField() == deepCloneT.getField());
    }
}
class Field implements Cloneable {
    public Field clone() throws CloneNotSupportedException {
        return (Field) super.clone();
    }
    public Field deepClone() throws CloneNotSupportedException {
        // 沒(méi)有引用類型屬性
        return this.clone();
    }
}

在這里插入圖片描述

到底使用淺拷貝還是深拷貝,要根據(jù)實(shí)際情況。但是有一點(diǎn)是確定的,深拷貝需要?jiǎng)?chuàng)建更多對(duì)象,占用更多內(nèi)存。

總結(jié)

本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • jstl EL表達(dá)式遍歷Map的方法

    jstl EL表達(dá)式遍歷Map的方法

    這篇文章主要介紹了jstl EL表達(dá)式遍歷Map的方法的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • SpringBoot整合Redis的哨兵模式的實(shí)現(xiàn)

    SpringBoot整合Redis的哨兵模式的實(shí)現(xiàn)

    Redis提供了哨兵模式來(lái)處理主從切換和故障轉(zhuǎn)移,本文主要介紹了SpringBoot整合Redis的哨兵模式的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • java類的組成結(jié)構(gòu)詳解

    java類的組成結(jié)構(gòu)詳解

    大家好,本篇文章主要講的是java類的組成結(jié)構(gòu)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 以Spring Boot的方式顯示圖片或下載文件到瀏覽器的示例代碼

    以Spring Boot的方式顯示圖片或下載文件到瀏覽器的示例代碼

    這篇文章主要介紹了以Spring Boot的方式顯示圖片或下載文件到瀏覽器的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot鏈路追蹤skyworking的接入方法

    SpringBoot鏈路追蹤skyworking的接入方法

    在SpringBoot項(xiàng)目中引入SkyWalking進(jìn)行鏈路追蹤,需要下載探針jar包,配置logback.xml,設(shè)置啟動(dòng)變量,以實(shí)現(xiàn)服務(wù)調(diào)用監(jiān)控和錯(cuò)誤預(yù)警,本文給大家介紹SpringBoot鏈路追蹤skyworking的接入方法,感興趣的朋友一起看看吧
    2024-10-10
  • springboot日志切面通用類實(shí)例詳解

    springboot日志切面通用類實(shí)例詳解

    這篇文章主要介紹了springboot日志切面通用類,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 基于Security實(shí)現(xiàn)OIDC單點(diǎn)登錄的詳細(xì)流程

    基于Security實(shí)現(xiàn)OIDC單點(diǎn)登錄的詳細(xì)流程

    本文主要是給大家介紹 OIDC 的核心概念以及如何通過(guò)對(duì) Spring Security 的授權(quán)碼模式進(jìn)行擴(kuò)展來(lái)實(shí)現(xiàn) OIDC 的單點(diǎn)登錄。對(duì)Security實(shí)現(xiàn)OIDC單點(diǎn)登錄的詳細(xì)過(guò)程感興趣的朋友,一起看看吧
    2021-09-09
  • Java實(shí)戰(zhàn)之基于TCP實(shí)現(xiàn)簡(jiǎn)單聊天程序

    Java實(shí)戰(zhàn)之基于TCP實(shí)現(xiàn)簡(jiǎn)單聊天程序

    這篇文章主要為大家詳細(xì)介紹了如何在Java中基于TCP實(shí)現(xiàn)簡(jiǎn)單聊天程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 解決spring boot 1.5.4 配置多數(shù)據(jù)源的問(wèn)題

    解決spring boot 1.5.4 配置多數(shù)據(jù)源的問(wèn)題

    下面小編就為大家?guī)?lái)一篇解決spring boot 1.5.4 配置多數(shù)據(jù)源的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java超全面梳理內(nèi)部類的使用

    Java超全面梳理內(nèi)部類的使用

    說(shuō)起內(nèi)部類這個(gè)詞,想必很多人都不陌生,但是又會(huì)覺(jué)得不熟悉。原因是平時(shí)編寫代碼時(shí)可能用到的場(chǎng)景不多,用得最多的是在有事件監(jiān)聽(tīng)的情況下,并且即使用到也很少去總結(jié)內(nèi)部類的用法。今天我們就來(lái)一探究竟
    2022-04-04

最新評(píng)論