跟着实例学习设计模式(7)-原型模式prototype(创建型)
原型模式是創建型模式。
設計意圖:用原型實例指定創建對象的類型,并通過拷貝這個原型來創建新的對象。
我們使用構建簡歷的樣例的類圖來說明原型模式。
類圖:
原型模式主要用于對象的復制。它的核心是就是類圖中的原型類Prototype。這里我們定義了一個抽象的原型接口,聲明了用于clone自己的方法,這里我們已創建簡歷為詳細原型類,Prototype類須要具備下面兩個條件:
- 實現Cloneable接口。在java語言有一個Cloneable接口,它的作用僅僅有一個。就是在執行時通知虛擬機能夠安全地在實現了此接口的類上使用clone方法。
在java虛擬機中,僅僅有實現了這個接口的類才干夠被拷貝,否則在執行時會拋出CloneNotSupportedException異常。
- 重寫Object類中的clone方法。
Java中,全部類的父類都是Object類,Object類中有一個clone方法,作用是返回對象的一個拷貝,可是其作用域protected類型的。一般的類無法調用,因此。Prototype類須要將clone方法的作用域改動為public類型。
??????? 原型模式是一種比較簡單的模式,也非常easy理解,實現一個接口,重寫一個方法即完畢了原型模式。在實際應用中,原型模式非常少單獨出現。經常與其它模式混用,他的原型類Prototype也經常使用抽象類來替代,這里我們在原型類上加了一個接口。該接口類繼承的Cloneable接口,這樣我們能夠在我們自己接口中更靈活的控制詳細原型類的邏輯是什么。
package com.prototype;/*** @author gaoxu* 實踐出真知!*/ public interface IPrototype extends Cloneable{public Prototype clone();public void show();}package com.prototype;/**原型抽象類。採用原型抽象類。能夠使詳細原型類有很多其它的可復用的屬性實現* @author gaoxu* 實踐出真知。*/ public abstract class Prototype implements IPrototype{String name = "";String mobile = "";public String getName() {return name;}public void setName(String name) {this.name = name;}public String getMobile() {return mobile;}public void setMobile(String mobile) {this.mobile = mobile;}@Overridepublic Prototype clone() {Prototype prototype = null; try {prototype = (Prototype) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return prototype;}public String toString(){return "mobile="+mobile+",name="+name; } }
package com.prototype;/*** 簡歷原型實現類* * @author gaoxu 實踐出真知。*/ public class Resume extends Prototype {@Overridepublic void show() {System.out.println(""+toString());}}
package com.prototype;/*** @author gaoxu* 實踐出真知!
*/ public class Client { /** * @param args */ public static void main(String[] args) { Resume resume = new Resume(); resume.setName("高旭"); resume.setMobile("1390000111"); Resume resume1 = (Resume) resume.clone(); Resume resume2 = (Resume) resume.clone(); System.out.println(resume.toString()); System.out.println(resume1.toString()); System.out.println(resume2.toString()); } }
原型模式的長處和適用場景:?????????????????????????????????????????? 最大的長處就是創建對象性能好。比new要快不少,由于Object類的clone方法是一個本地方法,它直接操作內存中的二進制流,特別是復制大對象時,性能的區別很明顯。所以須要反復創建對象的場景基本都能夠適用。
原型模式的注意事項
- 使用原型模式復制對象不會調用類的構造方法。由于對象的復制是通過調用Object類的clone方法來完畢的,它直接在內存中復制數據。不用又一次初始化,直接獲得對象執行時的狀態。
不但構造方法中的代碼不會執行,甚至連訪問權限都對原型模式無效。
單例模式中,僅僅要將構造方法的訪問權限設置為private型。就能夠實現單例??墒莄lone方法直接無視構造方法的權限。所以,單例模式與原型模式是沖突的,所以不能把單例模式的類對象進行拷貝,那樣就不是單例了。
總結
以上是生活随笔為你收集整理的跟着实例学习设计模式(7)-原型模式prototype(创建型)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webpack2+React 实例dem
- 下一篇: Python itertools模块