設(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)。
代碼實例


擴展
因為深拷貝使用了序列化機制,序列化機制會破壞單例模式.
解決方案:要么單例類不實現(xiàn)Cloneable接口,要么重寫clone()方法,在clone方法中返回單例對象即可,如下:
