日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)建型模式:原型模式

文章首發(fā):
創(chuàng)建型模式:原型模式

成都創(chuàng)新互聯(lián)公司是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計,網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十余年品質(zhì),值得信賴!

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

五大創(chuàng)建型模式之五:原型模式。

簡介

姓名:原型模式

英文名:Prototype Pattern

價值觀:效率第一

個人介紹

Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.
用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。
(來自《設(shè)計模式之禪》)

又到了一個系列的最后一篇文章了,今天是創(chuàng)建型模式的最后一篇。什么是創(chuàng)建型模式呢?創(chuàng)建型模式是對類的實例化過程進(jìn)行抽象,使對象的創(chuàng)建和使用分離,從而使代碼更加靈活。

我們平時使用最多的一種創(chuàng)建對象方式就是 new ABC(),直接通過構(gòu)造方法來創(chuàng)建一個對象。通過原型模式來創(chuàng)建對象則不用調(diào)用構(gòu)造方法,就可以創(chuàng)建一個對象。下面來揭開它的面紗。

你要的故事

前幾天有出版社的老師邀請寫書,鑒于深知自己水平還不足以出書,所以沒有合作,還在努力學(xué)習(xí),以后有能力有機會再考慮這方面的事情。

今天的故事就從出書講起。我們知道一本新書發(fā)版的時候,會復(fù)印很多冊,如果銷售得好,會有很多個印刷版本。我們來了解復(fù)印一批書籍這個過程是怎么實現(xiàn)的。小明寫下了下面這段代碼。

public class NoPrototypeTest {

    public static void main(String[] args) {
        for (int i = 1; i <= 10; i ++) {
            Book book = new Book("娛樂至死", "尼爾波茲曼", "社會科學(xué)", "XXXX");
            System.out.println("復(fù)印書籍:" + book.getName() + ",第 " + i + " 本");
        }
    }

}

class Book {
    private String name;
    private String author;
    private String type;
    private String content;

    public Book(String name, String author, String type, String content) {
        this.name = name;
        this.author = author;
        this.type = type;
        this.content = content;
        System.out.println("實例化書籍:" + this.name);
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

// 打印結(jié)果:
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 1 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 2 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 3 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 4 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 5 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 6 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 7 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 8 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 9 本
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 10 本

上面小明的代碼復(fù)印了 10 本《娛樂至死》,代碼邏輯沒有問題,有個問題就是復(fù)印一本就實例化一次書籍,這個實例化可以減少么?使用原型模式可以實現(xiàn)。小明根據(jù)這些提示,重新修改了代碼。

public class PrototypeTest {

    public static void main(String[] args) {
        Book2 book1 = new ConcreteBook("娛樂至死", "尼爾波茲曼", "社會科學(xué)", "XXXX");
        System.out.println("復(fù)印書籍:" + book1.getName() + ",第 " + 1 + " 本");
        for (int i = 2; i <= 10; i ++) {
            Book2 book2 = (Book2) book1.clone();
            System.out.println("復(fù)印書籍:" + book2.getName() + ",第 " + i + " 本");
        }

    }

}

/**
 * 抽象類
 */
abstract class Book2 implements Cloneable {

    private String name;
    private String author;
    private String type;
    private String content;

    public Book2(String name, String author, String type, String content) {
        this.name = name;
        this.author = author;
        this.type = type;
        this.content = content;
        System.out.println("實例化書籍:" + this.name);
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    protected Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

/**
 * 具體類
 */
class ConcreteBook extends Book2 {

    public ConcreteBook(String name, String author, String type, String content) {
        super(name, author, type, content);
    }
}

打印結(jié)果:
實例化書籍:娛樂至死
復(fù)印書籍:娛樂至死,第 1 本
復(fù)印書籍:娛樂至死,第 2 本
復(fù)印書籍:娛樂至死,第 3 本
復(fù)印書籍:娛樂至死,第 4 本
復(fù)印書籍:娛樂至死,第 5 本
復(fù)印書籍:娛樂至死,第 6 本
復(fù)印書籍:娛樂至死,第 7 本
復(fù)印書籍:娛樂至死,第 8 本
復(fù)印書籍:娛樂至死,第 9 本
復(fù)印書籍:娛樂至死,第 10 本

看,打印結(jié)果和第一次實現(xiàn)的結(jié)果完全不一樣,這一次只實例化了一次,后面復(fù)印的書籍都沒有實例化。我們看看代碼的變化,代碼中最最主要的就是 Book2 實現(xiàn)了 Cloneable 接口,這個接口有個 clone() 方法,通過實現(xiàn)這個方法,可以實現(xiàn)對象的拷貝,就是不用調(diào)用構(gòu)造方法,直接通過對內(nèi)存的拷貝來創(chuàng)建一個新的對象。這就是原型模式的實現(xiàn)方式,通過原型模式可以提高創(chuàng)建對象的效率。

代碼:
Prototype Pattern

總結(jié)

通過原型模式,繞過構(gòu)造方法創(chuàng)建對象,利用內(nèi)存直接拷貝對象,提高對象的創(chuàng)建性效率。在有大量的對象創(chuàng)建或者類初始化消耗多資源的場景下可以利用原型模式來優(yōu)化。當(dāng)然在實現(xiàn)的過程中,要注意淺拷貝與深拷貝的問題,防止寫出 bug,文章主要介紹原型模式,就不詳細(xì)說這個問題了,留給大家去擴(kuò)展了解。

推薦閱讀:
單一職責(zé)原則(方法:修改名字還是密碼?接口:洗碗、買菜還是倒垃圾?類:注冊、登錄和注銷)
里氏替換原則(我兒來自新東方烹飪)
依賴倒置原則(摳門的飯店老板)
接口隔離原則(小伙子的作坊)
迪米特法則(手機上看電子書)
開閉原則(社保這點事)
創(chuàng)建型模式:單例模式(小明就只有 1 輛車)
創(chuàng)建型模式:工廠方法(小明家的車庫)
創(chuàng)建型模式:抽象工廠(寶馬車就得用寶馬輪胎和寶馬方向盤)
創(chuàng)建型模式:建造者模式(湯這么煲)

公眾號后臺回復(fù)『大禮包』獲取 Java、Python、IOS 等教程
加個人微信備注『教程』獲取架構(gòu)師、機器學(xué)習(xí)等教程

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


新聞標(biāo)題:創(chuàng)建型模式:原型模式
文章來源:http://www.dlmjj.cn/article/gpcses.html