文章出處

使用頻率:★★★☆☆

一、什么是原型模式

通過復制一個已存在對象來生成一個新對象,被復制的對象稱為原型;

二、補充說明

1、JAVA中Object的clone方法已經為什么提供了復制對象的實現,且該方法為本地方法,性能好,在需要大量復制對象的情況,使用clone創建對象比new效率高;

補充下深拷貝和淺拷貝,深拷貝是通過拷貝內存(包括引用的對象)實現對象的創建;淺拷貝不拷貝引用的對象,但拷貝了引用的值,如果類的成員屬性中都是基本類型,不含對象,也是可以達到深拷貝的效果;深拷貝可以通過將對象序列化成字節流以及反序列化實現,淺拷貝直接調用clone即可;

2、使用原型模式創建對象是沒有調用類的構造方法的;

三、角色

原型角色(ps,也可以搞成兩個,如抽象原型角色以及各個具體實現原型角色)

四、JAVA實現例子

java已經很好的支持原型模式了,使用很簡便,如下類,實現了Cloneable接口,即成了一個原型;

package com.pichen.dp.creationalpattern.prototype;

public class Cell implements Cloneable{
    private int cellId;
    public int getCellId() {
        return cellId;
    }
    public void setCellId(int cellId) {
        this.cellId = cellId;
    }
    public Cell(int id) {
        this.cellId = id;
    }
    @Override
    public Object clone() throws CloneNotSupportedException
    {
        System.out.println("clone a cell obj.");
        return (Cell) super.clone();
    }
}

使用原型,復制10個拷貝:

package com.pichen.dp.creationalpattern.prototype;

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        Cell prototypeCell = new Cell(888);
        for(int i = 0; i < 10; i++){
            Cell copyCell = (Cell) prototypeCell.clone();
            System.out.println(copyCell.hashCode() + ":" + copyCell.getCellId());
        }
    }
}

觀察打印結果,hashcode不同,對象成員屬性一致,復制成功:

clone a cell obj.
25840096:888
clone a cell obj.
33040770:888
clone a cell obj.
23930419:888
clone a cell obj.
15142448:888
clone a cell obj.
22316618:888
clone a cell obj.
3969559:888
clone a cell obj.
10175206:888
clone a cell obj.
21307627:888
clone a cell obj.
24389376:888
clone a cell obj.
11317592:888

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()