溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2020-07-06 08:28:46 來源:網絡 閱讀:192 作者:LieBrother 欄目:軟件技術

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

創(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)建新的對象。
(來自《設計模式之禪》)

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

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

你要的故事

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

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

public class NoPrototypeTest {

    public static void main(String[] args) {
        for (int i = 1; i <= 10; i ++) {
            Book book = new Book("娛樂至死", "尼爾波茲曼", "社會科學", "XXXX");
            System.out.println("復印書籍:" + 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;
    }
}

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

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

public class PrototypeTest {

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

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

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

代碼:
Prototype Pattern

總結

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

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

公眾號后臺回復『大禮包』獲取 Java、Python、IOS 等教程
加個人微信備注『教程』獲取架構師、機器學習等教程

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

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI