設(shè)計模式-原型模式

設(shè)計模式-原型模式

定義

原型模式(Prototype Pattern)是指原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象,屬于創(chuàng)建型模式。

原型模式的核心在于拷貝原型對象。以系統(tǒng)中已存在的一個對象為原型,直接基于內(nèi)存二進制流進行拷貝,無需再經(jīng)歷耗時的對象初始化過程(不調(diào)用構(gòu)造函數(shù)),性能提升許多。當(dāng)對象的初始化過程比較耗時時,可以利用當(dāng)前系統(tǒng)已存在的對象做為原型,對其進行克隆(一般是基于內(nèi)存二進制流)來躲避初始化過程,使得新對象的創(chuàng)建時間大大減少。

原型模式主要使用場景:

1、類初始化消耗資源較多;

2、new產(chǎn)生的一個對象需要非常繁瑣的過程(數(shù)據(jù)準備、訪問權(quán)限等);

3、構(gòu)造函數(shù)比較復(fù)雜;

4、循環(huán)體中產(chǎn)生大量對象時。

在Spring中,原型模式應(yīng)用的非常廣泛。例如scope="prototype",在我們經(jīng)常用的JSON.parseObject()也是一種原型模式。

優(yōu)點

1、性能良好,Java自帶的原型模式是基于內(nèi)存二進制流的拷貝,比直接new一個對象性能上提升了許多。

2、可以使用深克隆方式保存對象的狀態(tài),使用原型模式將對象復(fù)制一份并將其狀態(tài)保存起來, 簡化了創(chuàng)建對象的過程,以便在需要的時候使用(例如恢復(fù)到歷史某一狀態(tài)),可付諸實現(xiàn)撤銷操作。

缺點

1、需要對每一個類配置一個克隆方法;

2、克隆方法位于類的內(nèi)部,當(dāng)對已有類進行改造的時候,需要修改代碼,違反了開閉原則;

3、在實現(xiàn)深克隆時需要編寫較為復(fù)雜的代碼,而且當(dāng)對象之間存在多重嵌套引用時,為了實現(xiàn)深克隆,每一層對象對應(yīng)的類都必須支持深克隆,實現(xiàn)起來會比較麻煩。因此,深、淺拷貝需要運用得當(dāng)。

代碼實例

原型模式:注意區(qū)別淺克隆和深克隆,往往使用序列化來實現(xiàn)深克隆.
測試淺克隆和深克隆~

擴展

因為深拷貝使用了序列化機制,序列化機制會破壞單例模式.

解決方案:要么單例類不實現(xiàn)Cloneable接口,要么重寫clone()方法,在clone方法中返回單例對象即可,如下:

重寫clone()方法,在clone方法中返回單例對象
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一 預(yù)備知識 1. 首先我們要知道 原型模式是設(shè)計模式中的創(chuàng)建型 2.要了解原型模式我們要了解java 中的深...
    CRUD_1133閱讀 457評論 0 0
  • 一、什么是原型模式 原型模式(Prototype),用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象...
    鋼镚koala閱讀 524評論 0 1
  • 原型模式的介紹 原型模式是一個創(chuàng)建型的模式,原型二字表明了該模式應(yīng)該有一個樣板實例,用戶從這個樣板對象中復(fù)制出一個...
    Android天之驕子閱讀 474評論 0 0
  • 前言 單例模式可以避免重復(fù)創(chuàng)建消耗資源的對象,但是卻不得不共用對象。若是對象本身也不讓隨意訪問修改時,怎么辦?通常...
    小波同學(xué)閱讀 261評論 0 0
  • 設(shè)計模式中,單例模式應(yīng)該是大家最為熟悉的了,那如果我們需要對一個對象進行多次復(fù)制的話,大家會用什么呢?這就要用到今...
    健健_1e44閱讀 243評論 0 0

友情鏈接更多精彩內(nèi)容