Java常用设计模式————原型模式(一)
介紹
????????原型模式(Prototype Pattern):用原型實(shí)例指定創(chuàng)建對象的種類,并通過拷貝這些原型創(chuàng)建新的對象。
????????原型模式用于創(chuàng)建重復(fù)的對象,同時又能保證性能。當(dāng)直接創(chuàng)建對象的代價比較大時,則采用這種模式。(例如,一個對象需要在高代價的數(shù)據(jù)庫操作之后被創(chuàng)建,并結(jié)合緩存機(jī)制,在下一次請求時返回它的克隆對象,在需要的時候更新數(shù)據(jù)庫,以此來減少數(shù)據(jù)庫調(diào)用)。
????? ? 原型模式的核心就是原型類,原型類需要具備以下兩個條件:
????? ? ·實(shí)現(xiàn)Cloneable接口。
????? ? Java中的Cloneable接口,作用只有一個:在運(yùn)行時通知虛擬機(jī)可以安全地在實(shí)現(xiàn)了此接口的類上使用clone()方法。在JVM中,只有實(shí)現(xiàn)了這個接口的類才可以被拷貝,否則在運(yùn)行時會拋出CloneNotSupportedException異常。
????? ? ·重寫Object類中的clone()方法。
????? ? Object類中的clone()方法,作用是返回對象的一個拷貝,但是其作用域protected類型的,一般的類無法調(diào)用,因此,Prototype類需要clone()方法的作用域修改為public? 。
深拷貝與淺拷貝
《Java常用設(shè)計(jì)模式————原型模式(二)之深拷貝與淺拷貝》
應(yīng)用場景
????????使用原型模式創(chuàng)建對象比直接new一個對象在性能上要好的多,因?yàn)镺bject類的clone方法是一個本地方法,它直接操作內(nèi)存中的二進(jìn)制流,特別是復(fù)制大對象時,性能的差別非常明顯。
????????使用原型模式的另一個好處是簡化對象的創(chuàng)建,使得創(chuàng)建對象就像我們在編輯文檔時的復(fù)制粘貼一樣簡單。
????????因?yàn)橐陨蟽?yōu)點(diǎn),所以在需要重復(fù)地創(chuàng)建相似對象時可以考慮使用原型模式。比如需要在一個循環(huán)體內(nèi)創(chuàng)建對象,假如對象創(chuàng)建過程比較復(fù)雜或者循環(huán)次數(shù)很多的話,使用原型模式不但可以簡化創(chuàng)建過程,而且可以使系統(tǒng)的整體性能提高很多。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.將產(chǎn)品的創(chuàng)建過程封裝起來,客戶端不需要了解產(chǎn)品的具體創(chuàng)建流程。
2.性能提高,逃避構(gòu)造函數(shù)的約束,尤其是那些很復(fù)雜的對象的時候。
3.可以在不修改其他代碼的情況下添加新的產(chǎn)品,符合“開閉原則”。
缺點(diǎn):
1.配備克隆方法需要對類的功能進(jìn)行通盤考慮,這對于新的類不一定容易,特別當(dāng)一個類引用不支持串行化的間接對象,或者引用含有循環(huán)結(jié)構(gòu)的時候。
2.必須實(shí)現(xiàn)一個特定接口。
3.每一個類都必須有一個clone方法,如果這個類的組成不太復(fù)雜的話還比較好,如果類的組成很復(fù)雜的話,如果想實(shí)現(xiàn)深度復(fù)制就比較困難了。
代碼實(shí)現(xiàn)
第一步:創(chuàng)建原型類
package design.pattern.prototype; /*** 原型模式實(shí)現(xiàn)類* * <br>類名:ConcretePrototype<br>* 作者: mht<br>* 日期: 2018年3月31日-上午10:14:00<br>*/ public class ConcretePrototype extends Prototype{public void show() {System.out.println("原型模式實(shí)現(xiàn)類...");} }第二步:實(shí)現(xiàn)原型類繼承
package design.pattern.prototype; /*** 原型類* <br>類名:Prototype<br>* 作者: mht<br>* 日期: 2018年3月31日-上午10:12:48<br>*/ public abstract class Prototype implements Cloneable{@Overrideprotected Object clone() {try {return super.clone();} catch (Exception e) {e.printStackTrace();}return null;} }測試
package design.pattern.prototype;public class Client {public static void main(String[] args) {ConcretePrototype cp = new ConcretePrototype();for (int i = 0; i < 10; i++) {ConcretePrototype c = (ConcretePrototype) cp.clone();c.show();}} }輸出結(jié)果:
原型模式實(shí)現(xiàn)類... 原型模式實(shí)現(xiàn)類... 原型模式實(shí)現(xiàn)類... 原型模式實(shí)現(xiàn)類... 原型模式實(shí)現(xiàn)類... 原型模式實(shí)現(xiàn)類... 原型模式實(shí)現(xiàn)類... 原型模式實(shí)現(xiàn)類... 原型模式實(shí)現(xiàn)類... 原型模式實(shí)現(xiàn)類...?
總結(jié)
以上是生活随笔為你收集整理的Java常用设计模式————原型模式(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程相关知识
- 下一篇: Java中常用的类,包,接口