上一篇 <<<適配器模式(Adapter Pattern)
下一篇 >>>工廠相關模式(Factory Pattern)
原型模式:使用克隆技術復制創(chuàng)建復雜的或者構造耗時的實例,被復制的對象就是所謂的“原型”。

應用場景
- a、類初始化需要消耗非常多的資源,包括數(shù)據(jù)庫、硬件資源等,使用拷貝可避免這些消耗
- b、new產(chǎn)生的對象需要非常繁瑣的數(shù)據(jù)準備或權限
- c、Spring框架中的多例就是使用原型
如何實現(xiàn)
- (1)實現(xiàn)Cloneable接口,只有實現(xiàn)了這個接口的類才可以被拷貝,否則在運行時會拋出CloneNotSupportedException異常。
- (2)重寫Object類中的clone方法。Object類中的clone方法是protected類型,Prototype類需要將clone方法的作用域修改為public類型
淺拷貝與深拷貝
淺復制:只是拷貝了基本類型的數(shù)據(jù),而引用類型數(shù)據(jù),復制后也是會發(fā)生引用,我們把這種拷貝叫做“(淺復制)淺拷貝”。
換句話說,淺復制僅僅是指向被復制的內(nèi)存地址,如果原地址中對象被改變了,那么淺復制出來的對象也會相應改變。
深復制:在計算機中開辟了一塊新的內(nèi)存地址用于存放復制的對象。
原型模式的核心代碼及效果
/**默認是淺克隆,基本類型和封裝類型(int、Integer、String)等都會被克隆,但引用類型ArrayList只是地址被復制,不會開辟新的空間
* 打印結果:
* book1原始數(shù)據(jù)showBook():
* {"age":22,"image":["圖1"],"num":2,"title":"書1"}
* book2直接克隆后showBook():
* {"age":22,"image":["圖1"],"num":2,"title":"書1"}
* book2修改數(shù)據(jù)后showBook():
* {"age":33,"image":["圖1","圖2"],"num":3,"title":"書2"}
* book1被克隆數(shù)據(jù)showBook():
* {"age":22,"image":["圖1","圖2"],"num":2,"title":"書1"}
*/
Book book = (Book) super.clone();
/**
* 下面開啟深復制后的打印結果:
* book1原始數(shù)據(jù)showBook():
* {"age":22,"image":["圖1"],"num":2,"title":"書1"}
* book2直接克隆后showBook():
* {"age":22,"image":["圖1"],"num":2,"title":"書1"}
* book2修改數(shù)據(jù)后showBook():
* {"age":33,"image":["圖1","圖2"],"num":3,"title":"書2"}
* book1被克隆數(shù)據(jù)showBook():
* {"age":22,"image":["圖1"],"num":2,"title":"書1"}
*/
book.image=(ArrayList<String>)this.image.clone();
相關文章鏈接:
<<<23種常用設計模式總覽
<<<代理模式(Proxy Pattern)
<<<裝飾模式(Decorator Pattern)
<<<觀察者模式(Observer Pattern)
<<<單例模式(Singleton Pattern)
<<<責任鏈模式(Chain of Responsibility Pattern)
<<<策略模式(Strategy Pattern)
<<<模板方法模式(Template Pattern)
<<<外觀/門面模式(Facade Pattern)
<<<建造者模式(Builder Pattern)
<<<適配器模式(Adapter Pattern)
<<<工廠相關模式(Factory Pattern)