原型模式,設計模式中難懂的模式之一,了解js的人都知道prototype,我猜測js中的物件就是通過原型模式建立的。現實的系統中也很少有使用原型模式的,因為它的使用場景比較特殊。下面就來分析一下原型模式。
定義:用原型例項指定建立物件的種類,並且通過拷貝這些原型來建立新的例項。
換句話說,原型模式就是通過複製現在已經存在的物件來建立乙個新的物件。
定**釋:
有的時候,在某些特定的系統中
,當建立乙個例項的過程比較複雜或者說是昂貴時(比如
建立例項的建構函式非常的複雜,在執行這個建構函式時會消耗較長的時間),
同時這個建構函式中的一些資訊又沒有什麼變化
(也就是說建立第乙個例項時初始化資訊是這樣的,建立第二個例項時初始化資訊還是還是這樣的),這種情況下使用new建立乙個例項的成本就很高,在這種情況下使用轉殖會更快。轉殖的意思就是複製現有的例項來建立新的例項,
這樣有什麼好處呢?第一,
客戶端根本就不知道具體要例項化的是哪乙個類,
它只知道是複製了,但具體的例項化情況,它卻是一無所知的,這樣便對客戶端進行了隱藏,第二
,複製乙個物件一般情況下會比建立乙個物件效能更高(當然有時候也不一定,只是一般情況而已)。而這種實現的方式就是原型模式。
使用場景:
(1)建立乙個例項的過程比較複雜或者昂貴時,一般指使用較長的時間或空間。
(2)每個物件內容之間變化很小,絕大多數內容都是相同的。
類圖:
例子:一般畫圖的軟體使用方法都是,在他提供的*******上通過拖拽的方式畫出自己需要的圖形,比如需要畫乙個矩形就在*******上選擇乙個矩形然後拖拽到畫板上。這樣就在畫板上生成了乙個矩形,同時軟體支援對所有的圖形有拖大縮小、移動、著色、填充等功能。也就是說,使用者需要建立乙個矩形,只需要將*******上有的矩形轉殖到自己的畫板上,而不需要構造怎麼畫出乙個矩形,如何設計他的移動、放大縮小、著色等功能。一方面,如果是通過new矩形的化,則建構函式的成本很高(邏輯複雜,時間久),另一方面,使用者也無需知道如何構造,只知道需要乙個矩形即可。
設計:我們使用原型模式來設計該*******,所有的圖形我們都作為一種原型,這樣使用者就可以拖拽來生成自己的物件。另外一方面,為了使所有的圖形都支援放大縮小、移動、著色等相同的功能,我們定義基類chart封裝所有的相同操作。
使用者需要生成的任何圖形,都通過拖拽*******上的圖形生成,我們設計矩形類rectangle是原型,提供抽象的clone方法,同時拖拽之後生成的類為drawrectangle類,該類是實現類,根據使用者的行為生成具體的例項。
實現:結果:
!!!hello world!!!
i am a user rectangle.
high:50
width:60
i am a user rectangle.
high:300
width:500
總結:當乙個物件的建立非常複雜或者難度很大,同時該物件的其他相同類的例項沒有太大區別時就可以考慮使用原型模式,原型模式使用當前已有物件去例項化新的物件,大多數情況下降低了物件建立的成本,並減少了客戶端和例項物件之間的耦合。
設計模式 原型模式
1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...
設計模式 原型模式
魔術師手拿一張百元大鈔,瞬間又變出兩張。也像配鑰匙一樣,拿一把鑰匙,老師傅就能做出另乙個一模一樣的。像這種複製我們並不陌生,類似於我們設計中的原型模式 本文將從以下幾點 原型模式 概述 結構圖 淺複製深複製 總結 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。允許乙個物件再建立另外...
設計模式 原型模式
原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。1 假設我們現有乙個物件,但是它的型別需要執行期確定,我們不知道它的動態型別是什麼,現在我們想建立它的副本。顯然通過建構函式建立是很麻煩的,這時候我們可以使用原型模式中的clone函式直接得到該物件的副本。2 有些時候我們想要...