国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

創(chuàng)建型模式-原型模式

這篇具有很好參考價(jià)值的文章主要介紹了創(chuàng)建型模式-原型模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、原型模式

1. 概述

用一個(gè)已經(jīng)創(chuàng)建的實(shí)例作為原型,通過(guò)復(fù)制該原型對(duì)象來(lái)創(chuàng)建一個(gè)和原型對(duì)象相同的新對(duì)象。

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

原型模式包含如下角色:

  • 抽象原型類(lèi):規(guī)定了具體原型對(duì)象必須實(shí)現(xiàn)的 clone() 方法。
  • 具體原型類(lèi):實(shí)現(xiàn)抽象原型類(lèi)的 clone() 方法,它是可被復(fù)制的對(duì)象。
  • 訪問(wèn)類(lèi):使用具體原型類(lèi)中的 clone() 方法來(lái)復(fù)制新的對(duì)象。

接口類(lèi)圖如下:

創(chuàng)建型模式-原型模式,設(shè)計(jì)模式,原型模式,java,設(shè)計(jì)模式

3. 實(shí)現(xiàn)

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

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

Java中的Object類(lèi)中提供了 clone() 方法來(lái)實(shí)現(xiàn)淺克隆。 Cloneable 接口是上面的類(lèi)圖中的抽象原型類(lèi),而實(shí)現(xiàn)了Cloneable接口的子實(shí)現(xiàn)類(lèi)就是具體的原型類(lèi)。

Realizetype(具體的原型類(lèi)):

public class Realizetype implements Cloneable {

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

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

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

PrototypeTest(測(cè)試訪問(wèn)類(lèi)):

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

        //調(diào)用Realizetype類(lèi)中的clone方法進(jìn)行對(duì)象的克隆
        Realizetype clone = realizetype.clone();

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

運(yùn)行結(jié)果為:
創(chuàng)建型模式-原型模式,設(shè)計(jì)模式,原型模式,java,設(shè)計(jì)模式

4. 案例

用原型模式生成“三好學(xué)生”獎(jiǎng)狀

同一學(xué)校的“三好學(xué)生”獎(jiǎng)狀除了獲獎(jiǎng)人姓名不同,其他都相同,可以使用原型模式復(fù)制多個(gè)“三好學(xué)生”獎(jiǎng)狀出來(lái),然后在修改獎(jiǎng)狀上的名字即可。

創(chuàng)建型模式-原型模式,設(shè)計(jì)模式,原型模式,java,設(shè)計(jì)模式

獎(jiǎng)狀類(lèi):

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 + "同學(xué):在2020學(xué)年第一學(xué)期中表現(xiàn)優(yōu)秀,被評(píng)為三好學(xué)生。特發(fā)此狀!");
    }

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

測(cè)試訪問(wèn)類(lèi):

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

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

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

運(yùn)行結(jié)果為:
創(chuàng)建型模式-原型模式,設(shè)計(jì)模式,原型模式,java,設(shè)計(jì)模式

1.5 使用場(chǎng)景

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

1.6 擴(kuò)展(深克隆)

將上面的“三好學(xué)生”獎(jiǎng)狀的案例中Citation類(lèi)的name屬性修改為Student類(lèi)型的屬性。

獎(jiǎng)狀類(lèi):

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() + "同學(xué):在2020學(xué)年第一學(xué)期中表現(xiàn)優(yōu)秀,被評(píng)為三好學(xué)生。特發(fā)此狀!");
    }

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

學(xué)生類(lèi):

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;
    }
}

測(cè)試類(lèi):

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

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

        //復(fù)制獎(jiǎng)狀
        Citation c2 = c1.clone();
        //獲取c2獎(jiǎng)狀所屬學(xué)生對(duì)象
        Student stu1 = c2.getStu();
        stu1.setName("李四");

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

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

運(yùn)行結(jié)果為:
創(chuàng)建型模式-原型模式,設(shè)計(jì)模式,原型模式,java,設(shè)計(jì)模式

說(shuō)明:
? stu對(duì)象和stu1對(duì)象是同一個(gè)對(duì)象,就會(huì)產(chǎn)生將stu1對(duì)象中name屬性值改為“李四”,兩個(gè)Citation(獎(jiǎng)狀)對(duì)象中顯示的都是李四。這就是淺克隆的效果,對(duì)具體原型類(lèi)(Citation)中的引用類(lèi)型的屬性進(jìn)行引用的復(fù)制。這種情況需要使用深克隆,而進(jìn)行深克隆需要使用對(duì)象流。

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

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

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

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

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

運(yùn)行結(jié)果為:
創(chuàng)建型模式-原型模式,設(shè)計(jì)模式,原型模式,java,設(shè)計(jì)模式
注意:Citation類(lèi)和Student類(lèi)必須實(shí)現(xiàn)Serializable接口,否則會(huì)拋NotSerializableException異常。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-644669.html

到了這里,關(guān)于創(chuàng)建型模式-原型模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【創(chuàng)建型設(shè)計(jì)模式】C#設(shè)計(jì)模式之原型模式

    原型模式是一種創(chuàng)建型設(shè)計(jì)模式,它通過(guò)復(fù)制現(xiàn)有對(duì)象來(lái)創(chuàng)建新對(duì)象,而無(wú)需通過(guò)實(shí)例化的方式。它允許我們使用已經(jīng)存在的對(duì)象作為藍(lán)本,從而創(chuàng)建新的對(duì)象,這樣可以避免重復(fù)初始化相似的對(duì)象,提高了對(duì)象的創(chuàng)建效率。 現(xiàn)在給您出一個(gè)題目: 假設(shè)您正在設(shè)計(jì)一個(gè)游戲

    2024年02月13日
    瀏覽(22)
  • c#設(shè)計(jì)模式-創(chuàng)建型模式 之 原型模式

    c#設(shè)計(jì)模式-創(chuàng)建型模式 之 原型模式

    原型模式是一種創(chuàng)建型設(shè)計(jì)模式,它允許你復(fù)制已有對(duì)象,而無(wú)需使代碼依賴(lài)它們所屬的類(lèi)。新的對(duì)象可以通過(guò)原型模式對(duì)已有對(duì)象進(jìn)行復(fù)制來(lái)獲得,而不是每次都重新創(chuàng)建。 原型模式包含如下角色: 抽象原型類(lèi):規(guī)定了具體原型對(duì)象必須實(shí)現(xiàn)的的 clone() 方法。 具體原型類(lèi)

    2024年02月11日
    瀏覽(19)
  • 設(shè)計(jì)模式-創(chuàng)建型模式(單例、工廠、建造、原型)

    設(shè)計(jì)模式:軟件設(shè)計(jì)中普遍存在(反復(fù)出現(xiàn))的各種問(wèn)題,所提出的解決方案。 面向?qū)ο笕筇匦裕悍庋b、繼承、多態(tài)。 面向?qū)ο笤O(shè)計(jì)的SOLID原則: (1)開(kāi)放封閉原則:一個(gè)軟件實(shí)體如類(lèi)、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。即軟件實(shí)體應(yīng)盡量在不修改原有代碼的情

    2024年02月08日
    瀏覽(28)
  • 【設(shè)計(jì)模式】第6節(jié):創(chuàng)建型模式之“原型模式”

    【設(shè)計(jì)模式】第6節(jié):創(chuàng)建型模式之“原型模式”

    由于本人現(xiàn)在所使用的語(yǔ)言主要是golang,所以后面的代碼主要使用golang編寫(xiě)。語(yǔ)言實(shí)現(xiàn)應(yīng)該不是障礙,主要是理解每種設(shè)計(jì)模式它的思想。 如果對(duì)象的創(chuàng)建成本比較大,而同一個(gè)類(lèi)的不同對(duì)象之間差別不大(大部分字段都相同),在這種情況下,我們可以利用對(duì)已有對(duì)象(原

    2024年02月06日
    瀏覽(34)
  • 創(chuàng)建型設(shè)計(jì)模式:5、原型模式(Prototype Pattern)

    目錄 1、原型模式的含義 2、C++實(shí)現(xiàn)原型模式的簡(jiǎn)單實(shí)例 1、原型模式的含義 通過(guò)復(fù)制現(xiàn)有對(duì)象來(lái)創(chuàng)建新對(duì)象,而無(wú)需依賴(lài)于顯式的構(gòu)造函數(shù)或工廠方法,同時(shí)又能保證性能。 The prototype pattern is a creational design pattern in software development. It is used when the type of objects to create is det

    2024年02月13日
    瀏覽(21)
  • 【C++設(shè)計(jì)模式之原型模式:創(chuàng)建型】分析及示例

    【C++設(shè)計(jì)模式之原型模式:創(chuàng)建型】分析及示例

    簡(jiǎn)介 原型模式(Prototype Pattern)是一種創(chuàng)建型設(shè)計(jì)模式,它允許通過(guò)復(fù)制已有對(duì)象來(lái)生成新的對(duì)象,而無(wú)需再次使用構(gòu)造函數(shù)。 描述 原型模式通過(guò)復(fù)制現(xiàn)有對(duì)象來(lái)創(chuàng)建新的對(duì)象,而無(wú)需顯式地調(diào)用構(gòu)造函數(shù)或暴露對(duì)象的創(chuàng)建細(xì)節(jié)。它使用原型接口來(lái)聲明克隆方法,所有實(shí)現(xiàn)

    2024年02月07日
    瀏覽(19)
  • 《golang設(shè)計(jì)模式》第一部分·創(chuàng)建型模式-02-原型模式(Prototype)

    《golang設(shè)計(jì)模式》第一部分·創(chuàng)建型模式-02-原型模式(Prototype)

    用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象 Prototype(抽象原型類(lèi)):它是聲明克隆方法的接口,或所有具體原型類(lèi)的公共父類(lèi) 它可以是抽象類(lèi)也可以是接口,甚至還可以是具體實(shí)現(xiàn)類(lèi)。 ConcretePrototype(具體原型類(lèi)):它實(shí)現(xiàn)在抽象原型類(lèi)中聲明的

    2024年02月14日
    瀏覽(26)
  • JAVA設(shè)計(jì)模式----原型設(shè)計(jì)模式

    JAVA設(shè)計(jì)模式----原型設(shè)計(jì)模式

    定義 :用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi),并通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。 類(lèi)型 :創(chuàng)建類(lèi)模式 類(lèi)圖 : 原型模式主要用于對(duì)象的復(fù)制,它的核心是就是類(lèi)圖中的原型類(lèi)Prototype。Prototype類(lèi)需要具備以下兩個(gè)條件: 實(shí)現(xiàn)Cloneable接口。在java語(yǔ)言有一個(gè)Cloneable接口,它的作用只

    2024年02月13日
    瀏覽(27)
  • Java設(shè)計(jì)模式-原型模式

    原型模式是一種創(chuàng)建型設(shè)計(jì)模式,它允許在運(yùn)行時(shí)通過(guò)復(fù)制現(xiàn)有對(duì)象來(lái)創(chuàng)建新對(duì)象,而不是通過(guò)構(gòu)造函數(shù)創(chuàng)建。這個(gè)模式的核心思想是基于一個(gè)現(xiàn)有的對(duì)象克隆一個(gè)新的對(duì)象,這個(gè)過(guò)程對(duì)外部世界是透明的,就像對(duì)象從未被克隆過(guò)一樣。 原型模式的一個(gè)關(guān)鍵優(yōu)點(diǎn)是可以避免在

    2024年02月03日
    瀏覽(28)
  • Java設(shè)計(jì)模式之原型模式

    ????????原型模式(Prototype Pattern)是用于創(chuàng)建重復(fù)的對(duì)象,同時(shí)又能保證性能。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式之一。 ????????這種模式是實(shí)現(xiàn)了一個(gè)原型接口,該接口用于創(chuàng)建當(dāng)前對(duì)象的克隆。當(dāng)直接創(chuàng)建對(duì)象的代價(jià)比較大

    2024年02月10日
    瀏覽(46)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包