欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設(shè)計模式之原型模式詳細解析

 更新時間:2023年11月23日 10:45:59   作者:Super_Leng  
這篇文章主要介紹了Java設(shè)計模式之原型模式詳細解析,原型模式就是用一個已經(jīng)創(chuàng)建的實例作為原型,通過復制該原型對象來創(chuàng)建一個和原型對象相同的新對象,需要的朋友可以參考下

一、原型模式

1. 概述

用一個已經(jīng)創(chuàng)建的實例作為原型,通過復制該原型對象來創(chuàng)建一個和原型對象相同的新對象。

2. 結(jié)構(gòu)

原型模式包含如下角色:

抽象原型類:規(guī)定了具體原型對象必須實現(xiàn)的 clone() 方法。具體原型類:實現(xiàn)抽象原型類的 clone() 方法,它是可被復制的對象。訪問類:使用具體原型類中的 clone() 方法來復制新的對象。

接口類圖如下:

在這里插入圖片描述

3. 實現(xiàn)

原型模式的克隆分為淺克隆和深克隆。

  • 淺克?。簞?chuàng)建一個新對象,新對象的屬性和原來對象完全相同,對于非基本類型屬性,仍指向原有屬性所指向的對象的內(nèi)存地址。
  • 深克?。簞?chuàng)建一個新對象,屬性中引用的其他對象也會被克隆,不再指向原有對象地址。

Java中的Object類中提供了 clone() 方法來實現(xiàn)淺克隆。

Cloneable 接口是上面的類圖中的抽象原型類,而實現(xiàn)了Cloneable接口的子實現(xiàn)類就是具體的原型類。

Realizetype(具體的原型類):

public class Realizetype implements Cloneable {

    public Realizetype() {
        System.out.println("具體的原型對象創(chuàng)建完成!");
    }

    @Override
    public Realizetype clone() throws CloneNotSupportedException {
        System.out.println("具體原型復制成功!");

        return (Realizetype) super.clone();
    }
}

PrototypeTest(測試訪問類):

public class PrototypeTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        //創(chuàng)建一個原型類對象
        Realizetype realizetype = new Realizetype();

        //調(diào)用Realizetype類中的clone方法進行對象的克隆
        Realizetype clone = realizetype.clone();

        System.out.println("原型對象和克隆出來的是否是同一個對象?" + (realizetype == clone));
    }
}

運行結(jié)果為:

在這里插入圖片描述

4. 案例

用原型模式生成“三好學生”獎狀

同一學校的“三好學生”獎狀除了獲獎人姓名不同,其他都相同,可以使用原型模式復制多個“三好學生”獎狀出來,然后在修改獎狀上的名字即可。

在這里插入圖片描述

獎狀類:

public class Citation implements Cloneable {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return (this.name);
    }

    public void show() {
        System.out.println(name + "同學:在2020學年第一學期中表現(xiàn)優(yōu)秀,被評為三好學生。特發(fā)此狀!");
    }

    @Override
    public Citation clone() throws CloneNotSupportedException {
        return (Citation) super.clone();
    }
}

測試訪問類:

public class CitationTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        Citation c1 = new Citation();
        c1.setName("張三");

        //復制獎狀
        Citation c2 = c1.clone();
        //將獎狀的名字修改李四
        c2.setName("李四");

        c1.show();
        c2.show();
    }
}

運行結(jié)果為:

在這里插入圖片描述

5 使用場景

  • 對象的創(chuàng)建非常復雜,可以使用原型模式快捷的創(chuàng)建對象。
  • 性能和安全要求比較高。

6 擴展(深克隆)

將上面的“三好學生”獎狀的案例中Citation類的name屬性修改為Student類型的屬性。

獎狀類:

public class Citation implements Cloneable {
    private Student stu;

    public Student getStu() {
        return stu;
    }

    public void setStu(Student stu) {
        this.stu = stu;
    }

    void show() {
        System.out.println(stu.getName() + "同學:在2020學年第一學期中表現(xiàn)優(yōu)秀,被評為三好學生。特發(fā)此狀!");
    }

    @Override
    public Citation clone() throws CloneNotSupportedException {
        return (Citation) super.clone();
    }
}

學生類:

public class Student {
    private String name;
    private String address;

    public Student(String name, String address) {
        this.name = name;
        this.address = address;
    }

    public Student() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

測試類:

public class CitationTest {
    public static void main(String[] args) throws CloneNotSupportedException {

        Citation c1 = new Citation();
        Student stu = new Student("張三", "西安");
        c1.setStu(stu);

        //復制獎狀
        Citation c2 = c1.clone();
        //獲取c2獎狀所屬學生對象
        Student stu1 = c2.getStu();
        stu1.setName("李四");

        //判斷stu對象和stu1對象是否是同一個對象
        System.out.println("stu和stu1是同一個對象?" + (stu == stu1));

        c1.show();
        c2.show();
    }
}

運行結(jié)果為:

在這里插入圖片描述

說明: ? stu對象和stu1對象是同一個對象,就會產(chǎn)生將stu1對象中name屬性值改為“李四”,兩個Citation(獎狀)對象中顯示的都是李四。

這就是淺克隆的效果,對具體原型類(Citation)中的引用類型的屬性進行引用的復制。

這種情況需要使用深克隆,而進行深克隆需要使用對象流。

public class CitationTest1 {
    public static void main(String[] args) throws Exception {
        Citation c1 = new Citation();
        Student stu = new Student("張三", "西安");
        c1.setStu(stu);

        //創(chuàng)建對象輸出流對象
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\Think\\Desktop\\b.txt"));
        //將c1對象寫出到文件中
        oos.writeObject(c1);
        oos.close();

        //創(chuàng)建對象出入流對象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\Think\\Desktop\\b.txt"));
        //讀取對象
        Citation c2 = (Citation) ois.readObject();
        //獲取c2獎狀所屬學生對象
        Student stu1 = c2.getStu();
        stu1.setName("李四");

        //判斷stu對象和stu1對象是否是同一個對象
        System.out.println("stu和stu1是同一個對象?" + (stu == stu1));

        c1.show();
        c2.show();
    }
}

運行結(jié)果為:

在這里插入圖片描述

注意:Citation類和Student類必須實現(xiàn)Serializable接口,否則會拋NotSerializableException異常。

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

相關(guān)文章

  • 詳解SpringBoot如何開啟異步編程

    詳解SpringBoot如何開啟異步編程

    本文主要介紹了詳解SpringBoot如何開啟異步編程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • SWT(JFace)小制作 FileBrowser文件瀏覽

    SWT(JFace)小制作 FileBrowser文件瀏覽

    SWT(JFace)小制作 FileBrowser文件瀏覽
    2009-06-06
  • java?kafka如何動態(tài)設(shè)置用戶讀寫權(quán)限

    java?kafka如何動態(tài)設(shè)置用戶讀寫權(quán)限

    這篇文章主要介紹了java?kafka如何動態(tài)設(shè)置用戶讀寫權(quán)限問題,具有很好的參考家價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java下3中XML解析 DOM方式、SAX方式和StAX方式

    Java下3中XML解析 DOM方式、SAX方式和StAX方式

    目前我知道的JAVA解析XML的方式有:DOM, SAX, StAX;如果選用這幾種,感覺還是有點麻煩;如果使用:JAXB(Java Architecture for XML Binding),個人覺得太方便了
    2013-04-04
  • Java 獲取網(wǎng)絡(luò)302重定向URL的方法

    Java 獲取網(wǎng)絡(luò)302重定向URL的方法

    在本篇文章里小編給大家整理的是關(guān)于Java 獲取網(wǎng)絡(luò)302重定向URL的方法以及相關(guān)知識點,有興趣的朋友們參考下。
    2019-08-08
  • java中File類的三種創(chuàng)建文件夾方法總結(jié)

    java中File類的三種創(chuàng)建文件夾方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于java中File類的三種創(chuàng)建文件夾方法,File類代表文件或目錄路徑名的抽象表達形式,通過File類提供的方法,我們可以很方便地創(chuàng)建文件夾,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • 詳解java==運算符和equals()方法的區(qū)別

    詳解java==運算符和equals()方法的區(qū)別

    這篇文章主要介紹了java==運算符和equals()方法的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • SpringBoot下的值注入(推薦)

    SpringBoot下的值注入(推薦)

    這篇文章主要介紹了SpringBoot下的值注入(推薦)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • MyBatisPlus3如何向數(shù)據(jù)庫中存入List

    MyBatisPlus3如何向數(shù)據(jù)庫中存入List

    本文主要介紹了Mybatis Plus的類型處理器的使用,通過User.java和UserMapper.xml示例進行詳細的解析,并提供了JSON解析器的使用方法,希望通過這篇文章,可以幫助大家更好的理解和掌握Mybatis Plus的類型處理器
    2024-10-10
  • java基礎(chǔ)之數(shù)組常用操作總結(jié)(必看篇)

    java基礎(chǔ)之數(shù)組常用操作總結(jié)(必看篇)

    下面小編就為大家?guī)硪黄猨ava基礎(chǔ)之數(shù)組常用操作總結(jié)(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06

最新評論