dart設計模式之原型模式
原型模式
模式分析
原型模式(Prototype Pattern)是用于創建重復的對象,同時又能保證性能。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。
這種模式是實現了一個原型接口,該接口用于創建當前對象的克隆。當直接創建對象的代價比較大時,則采用這種模式。例如,一個對象需要在一個高代價的數據庫操作之后被創建。我們可以緩存該對象,在下一個請求時返回它的克隆,在需要的時候更新數據庫,以此來減少數據庫調用。
模式解決問題
當一個系統應該獨立于它的產品創建,構成和表示時。
當要實例化的類是在運行時刻指定時,例如,通過動態裝載。
為了避免創建一個與產品類層次平行的工廠類層次時。
當一個類的實例只能有幾個不同狀態組合中的一種時。建立相應數目的原型并克隆它們可能比每次用合適的狀態手工實例化該類更方便一些。
模式難點
克隆
優點
性能提高。
逃避構造函數的約束。
缺點
配備克隆方法需要對類的功能進行通盤考慮,這對于全新的類不是很難,但對于已有的類不一定很容易,特別當一個類引用不支持串行化的間接對象,或者引用含有循環結構的時候。
必須實現 Cloneable 接口。
模式應用場景
資源優化場景。
類初始化需要消化非常多的資源,這個資源包括數據、硬件資源等。
性能和安全要求的場景。
通過 new 產生一個對象需要非常繁瑣的數據準備或訪問權限,則可以使用原型模式。
一個對象多個修改者的場景。
一個對象需要提供給其他對象訪問,而且各個調用者可能都需要修改其值時,可以考慮使用原型模式拷貝多個對象供調用者使用。
在實際項目中,原型模式很少單獨出現,一般是和工廠方法模式一起出現,通過 clone 的方法創建一個對象,然后由工廠方法提供給調用者。原型模式已經與 Java 融為渾然一體,大家可以隨手拿來使用。
模式代碼
abstract class ProtoType{ String _id; ProtoType(this._id); String get id=>_id; void set id(String id)=>this._id=id; ProtoType clone(); } class ConcretePrototype extends ProtoType{ ConcretePrototype(String id,this.name) : super(id); final String name; @override ConcretePrototype clone() { ProtoType protoType = new ConcretePrototype(this.id,this.name); return protoType; } } class RunPrototype implements Run { @override main(){ var a= ConcretePrototype("1","protoType模式"); var b= a.clone(); print("實例a的hashCode:"+a.hashCode.toString()); print("實例b的hashCode:"+b.hashCode.toString()); print("實例a的name:"+a.name); print("實例b的name:"+b.name); } @override String name="原型模式"; }
數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。