設計模式之原型模式

  1. 什麼事原型模式(Prototype)

    • 用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象
    • 原型模式的核心是一個clone方法
    • 優點:性能優良,在內存二進制流的拷貝,不執行構造器
  2. 使用場景

    • 資源優化:類初始化需要消耗非常多的資源
    • 性能和安全要求的場景:通過new產生一個對象需要非常繁瑣的數據準備或者訪問權限
    • 一個或者多個對象修改者的場景:一個對象需要提供給其他對象訪問,而且各個調用者可能都需要修改其值時
  3. 注意

    • 構造函數不會被執行
    • 基本數據類型以及String類型是進行的值拷貝;一般的對象的引用進行的時淺拷貝(對象和數組等),需要深拷貝的時候必須進行特殊處理
    • clone方法和final關鍵字是衝突的
  4. 示例代碼

package com.pattern.prototype;

import java.util.Date;

/**
 * 原型模式
 * @author yjzhou 
 */
public class Chair implements Cloneable {
    /** 椅腿數量 */
    private int footNum;
    /** 生產日期 */
    private Date date;

    public Chair(int footNum, Date date) {
        this.date = new Date(date.getTime());
        this.footNum = footNum;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public int getFootNum() {
        return footNum;
    }

    public void setFootNum(int footNum) {
        this.footNum = footNum;
    }

    /**
     * 複寫Object的clone方法
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    /**
     * 克隆椅子,深克隆
     * 
     * @return
     * @throws CloneNotSupportedException
     */
    public Chair chairClone() throws CloneNotSupportedException {
        Chair chair = (Chair) this.clone();
        // 去掉下面這一行,則淺克隆,新對象的date和原來的date指向同一內存
        chair.date = (Date) chair.date.clone();
        return chair;
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Chair oldChair = new Chair(4, new Date());
        Chair newChair = oldChair.chairClone();
        if (newChair.getDate() == oldChair.getDate()) {
            System.out.println("date引用相同");
        } else {
            System.out.println("date引用不同");
        }

        if (oldChair.getDate().equals(newChair.getDate())) {
            System.out.println("date值相同");
        } else {
            System.out.println("date值不相同");
        }

        oldChair.getDate().setHours(20);
        ;
        System.out.println(oldChair.getDate());
        System.out.println(newChair.getDate());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章