1. 程式人生 > >建立型模式之原型模式(2.3)

建立型模式之原型模式(2.3)

什麼是原型模式?

簡單來說,通過複製的方式建立物件。(被複制的物件可以理解為模板)


原型模式的應用場景

複雜結構物件的建立。

複雜結構物件:可以理解為物件裡面還有物件。


【舉個栗子】:點外賣的收貨地址


收貨地址包括姓名,電話和住址。第一次點外賣的時候需要完整的填寫這些資訊,但是之後點的過程基本上是不用再重新填寫這些資訊的。試想一下,每次下單之前都要填一遍姓名,電話,詳細地址(假設省市已經定位好了)。頭大.....而這個場景,正是原型模式的用武之地。

點外賣之前複製上一次填寫的地址,直接下單;或者手機號出現變更,修改一下直接更新到模板即可。

原型模式的本質是建立一個物件模板,然後通過複製的方式實現複用。


深拷貝(複雜物件一波帶走)

在深拷貝之前,簡單聊一下淺拷貝。

以上述收貨地址為例,如果只涉及到姓名,電話這些基本資料型別(淺拷貝與深拷貝是基本沒有區別的),但是如果涉及到地址這樣的引用型別。淺拷貝就會出現問題。淺拷貝對於引用物件,只複製其引用地址。所以複製出來的物件和被複制的物件會指向同一個值。假設你想建立兩個收貨模板,地址是不同的,那麼就只能使用深拷貝了。


擼段程式碼試試看:

思路:

1.建立Info類和Address類繼承Serializable介面,為了後面實現序列化寫入記憶體。(實現平臺無關性)

2.Info類還需要繼承Cloneable介面,並重寫clone()方法,注:protected改為public

3.在clone()方法中新增寫入記憶體和讀取的邏輯

4.Info info1 = (Info) info.clone();建立物件,並可做靈活修改。

import java.io.*;

class Address implements  Serializable
{
    private String province;
    private String city;
    private String Street;
    private String door_number;

    public Address(String province, String city, String street, String door_number) {
        this.province = province;
        this.city = city;
        Street = street;
        this.door_number = door_number;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStreet() {
        return Street;
    }

    public void setStreet(String street) {
        Street = street;
    }

    public String getDoor_number() {
        return door_number;
    }

    public void setDoor_number(String door_number) {
        this.door_number = door_number;
    }

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                ", Street='" + Street + '\'' +
                ", door_number='" + door_number + '\'' +
                '}';
    }
}

class Info implements Cloneable, Serializable   //1.建立一個外賣資訊類,繼承Cloneable(可複製),Serializable(可序列化)
{
    private String name;
    private String number;

    Address address;

    public String getName() {
        return name;
    }

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

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Address getAddress() {
        return address;
    }

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

    public Info(String name, String number, Address address) {
        this.name = name;
        this.number = number;
        this.address = address;
    }

    @Override
    public String toString() {
        return "Info{" +
                "name='" + name + '\'' +
                ", number='" + number + '\'' +
                ", address=" + address +
                '}';
    }

    @Override
    public Object clone() throws CloneNotSupportedException {    //2.重寫clone方法,並把protected換成public
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
                ObjectOutputStream oos = new ObjectOutputStream(out);
                oos.writeObject(this);   //寫入記憶體
                oos.close();

            byte[] bytes = out.toByteArray();
            InputStream in = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(in);
            Object clone = ois.readObject();  //讀取記憶體
            ois.close();

            return clone;

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}

/*
clone()方法直接複製在記憶體中已經建立物件的二進位制,效率極高!(不需要呼叫構造器)

protected native Object clone() throws CloneNotSupportedException;
native修飾的方法直接呼叫底層的C語言

 */
public class MyInfo
{
    public static void main(String[] args) throws CloneNotSupportedException {
        Info info = new Info("shadow","18116207310",new Address("上海","浦東新區","振南路","355"));
        System.out.println(info);
        Info info1 = (Info) info.clone();  //3.複製加強轉
        System.out.println(info1);

        System.out.println("//修改電話:");
        Info info2 = (Info) info.clone();
        info2.setNumber("123456789");
        System.out.println(info2);

        System.out.println("//修改地址:");
        Info info3 = (Info) info.clone();
        info3.getAddress().setStreet("西語街");
        info3.getAddress().setDoor_number("666");

        System.out.println(info3);
    }
}

輸出結果:

相關推薦

建立模式原型模式2.3

什麼是原型模式? 簡單來說,通過複製的方式建立物件。(被複制的物件可以理解為模板) 原型模式的應用場景 複雜結構物件的建立。 複雜結構物件:可以理解為物件裡面還有物件。 【舉個栗子】:點外賣的收貨地址 收貨地址包括姓名,電話和住址。第一次點外賣的時候需要完整的填寫這些資訊,但是之後點的過程基本上是不用再

java設計模式(建立模式)原型模式prototype

原型模式: 通過產生一個物件需要非常複雜的資料準備或訪問許可權.則可以使用原型模式 java中的克隆技術,以某個物件為原型,複製出新的物件, 優勢:效率高(直接克隆,避免了重複執行構造過程) 克隆類似於new,但是不同於new.new建

建立設計模式原型模式

原型模式的介紹 原型二字代表該模式應該有一個樣板例項,使用者從這個樣板中複製出一個內部屬性一致的物件,這個過程也就是我們俗稱的“克隆”。被複制的例項就是我們所稱的“原型”。原型模式多用於建立複雜的或者構造耗時的例項,因為這種情況下,複製一個已經存在的例項可以使程式執行更高效

研磨設計模式 原型模式Prototype2 ——跟著cc學設計系列

9.2  解決方案 9.2.1  原型模式來解決 用來解決上述問題的一個合理的解決方案就是原型模式。那麼什麼是原型模式呢? (1 )原型模式定義   (2 )應用原型模式來解決的思路 仔細分析上面的問題,在saveOrder方法裡面,已經有了訂單介面型別的物件例項,是從外部傳入的,但是這裡只是知道這

GOF23設計模式原型模式建立模式總結

 原型模式prototype 原型模式又稱做克隆模式,拷貝模式。實際上是一個記憶體的操作 原型模式 --通過new產生一個物件需要非常繁瑣的資料準備或訪問許可權,則可以使用原型

設計模式---對象創建模式原型模式prototype

col 具體類 不同 new mark out 初始化 isp clas 一:概念 原型模式(Prototype Pattern) 實際上就是動態抽取當前對象運行時的狀態 Prototype模式是一種對象創建型模式,它采取復制原型對象的方法來創建對象的實例

設計模式原型模式十三

原型模式是設計模式中算是簡單的一種設計模式了,因為它有語言實現的支撐,只需要呼叫定義好了的方法即可使用,在寫這篇設計模式之前,我看過很多資料,有幾點比較疑惑的點,在這篇文章中驗證,也順便描述一下什麼是原型模式。  定義:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。

設計模式原型模式java實現

原型模式(Prototype Pattern):就是從一個物件再建立另一個可定製物件的,而且不需要知道任何建立的細節。所謂原型模式,就是 Java 中的克隆技術,以某個物件為原型。複製出新的物件。顯然新的物件具備原 型物件的特點,效率高(避免了重新執行構造過程步驟)。 所以當直接建立物件代價

【學習筆記】建立模式原型模式

在某些應用程式中,某些物件(一種類別)比較複雜,且其建立過程比較複雜,並且我們需要頻繁使用到這些物件。如果我們一直使用new的方式來建立這些物件,會導致程式效率低下。 如果我們預先建立好該物件(即原型),通過該物件的自我複製(克隆)得到物件例項,從而提高程式碼效

設計模式原型模式C++

設計模式之原型模式 原型模式是用原型例項指定建立兌現的種類,並且通過拷貝這些原型建立新的物件。原型模式說白了其實就是有一個把自己拷貝一下的方法。該模式很好理解,該模式獨特地方不是類與類之間的關係,更多的是從語義上理解,只是實現了一個介面而已。 其UML圖如下:

研磨設計模式 原型模式Prototype1 ——跟著cc學設計系列

9.1  場景問題 9.1.1  訂單處理系統 考慮這樣一個實際應用:訂單處理系統。 現在有一個訂單處理的系統,裡面有個儲存訂單的業務功能,在這個業務功能裡面,客戶有這麼一個需求:每當訂單的預定產品數量超過1000的時候,就需要把訂單拆成兩份訂單來儲存,如果拆成兩份訂單

操作模式Template Method模板方法模式

1.如果你期望在一個方法中實現一個演算法,把演算法中的某些步驟的定義推遲到子類中去重新定義,可使用Template Method(模板方法)模式 2.舉例 //演算法框架抽象類 public abstract class AbstractMethod {

JAVA設計模式原型模式prototype

原型模式: 原型模式又叫克隆模式 Java自帶克隆模式 實現克隆模式必須實現Cloneable 介面,如果不實現會發生java.lang.CloneNotSupportedException異常 當某個類的屬性已經設定好需要建立很多相同屬性值的物件的時候使用clone模式非常方便 使用clone模式不見得比

Head First設計模式原型模式

webkit ble -1 否則 type sof 異常 構圖 etc 用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。 原型模式是一種比較簡單的模式,也非常容易理解,實現一個接口,重寫一個方法即完成了原型模式。在實際應用中,原型模式很少單獨出現。經常與其

一天學習一個設計模式原型模式

拷貝 pre des prot transient ret 哈哈 his 耗時 原型模式(Prototype),用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。   原型模式其實就是從一個對象再創建另外一個可定制的對象,而且不需要知道任何創建的細節。例

go設計模式原型模式

tin ros oge soft 高效 errors %d light 相等   原型模式是創建型模式的一種,其特點在於通過“復制”一個已經存在的實例來返回新的實例,而不是新建實例。被復制的實例就是我們所稱的“原型”,這個原型是可定制的。原型模式多用於創建復雜的或者耗時的實

設計模式原型模式

name 原形 ace pre 我們 指定 通過 值類型 常常 原型模式(Prototype Pattern):用原型實例指定創建對象的種類,並且通過復制這些原型創建新的對象。 作用(解決的問題):簡化對象的創建過程。 優點: 1、當創建對象的實例較為復雜的時候,使用原型模

java設計模式原型模式

ria sets 對象 ace ner 方法 .get chang lose 原型模式:通過原型實例創建新的對象,就不再需要關心這個實例本身的類型,只要實現了克隆自身的方法,就可以通過這個方法來獲取新的對象,而無須再去通過new來創建。 原型模式有以下幾種方式:簡單形式(

Java設計模式 原型模式

Java設計模式 - 原型模式   原型模式應用場景: 原型模式是指用原型例項指定建立物件的種類,並且通過複製這些原型建立新的物件.適合原型模式的情景如下:程式需要從一個物件出發,得到i若干個和其狀態相同,並可獨立變化其狀態的物件時;物件建立需要獨立於它的構造方法和表示時,以原

趣味設計模式原型模式

    有一天,八戒問悟空,“大師兄,你怎麼可以拔一搓猴毛就可以生成無數個一摸一樣的你,怎麼那麼神奇?師兄既然是齊天大聖,我老豬有個問題向請教下,在程式設計的世界中,我怎麼可以實現呢?我想在下次的時候也玩一把,這樣我就可以躺著吃喝,不用幹活了,哈哈”   &nb