原型模式的目標是在編譯期就獲得乙個或一系列可以在執行期無限次轉殖的物件。比如使用者註冊時的預設模板或者某些服務的預設**方案。原型模式與建造者模式最大的不同點在於,原型模式獲取的物件時轉殖出來的而不是在執行時建造出來的。也可以使用乙個類似快取的解決方案,用原型儲存資訊。
原型設計模式的主要目標是避免重複建立物件。 想象一下乙個預設的物件,它由幾十個欄位和嵌入的型別組成。 我們不想每次使用物件時都編寫這種型別所需的所有內容,特別是如果我們可以通過建立具有不同基礎的例項來弄亂它的話:
實現乙個襯衣商店,裡面有一些襯衣(包括預設的顏色和**)。所有襯衣都會有庫存,還有乙個系統去維護商品存放的位址。
我們使用襯衣的原型,每次我們需要乙個新襯衣時,就將此原型拿出來,轉殖和使用。
type iteminfogetter inte***ce
type shirtcolor byte
type shirt struct
func (s *shirt) getinfo() string
func (s *shirt) getprice() float32
var whiteprototype *shirt = &shirt
var blackprototype *shirt = &shirt
var blueprototype *shirt = &shirt
shirt
結構體實現了iteminfogetter
介面,具有列印具體資訊的功能,同時記錄了**,庫存和顏色。(強行實現乙個介面可能是為了「面向介面程式設計」),同時定義了預設物件whiteprototype
等,該物件在編譯期就已經產生。
隨後定義乙個shirtcache
結構體,具有根據輸入引數返回相應預設物件指標的作用
const (
white = 1
black = 2
blue = 3
)type shirtcache struct{}
func (s *shirtcache) getclone(m int) (iteminfogetter, error)
}
注意,此處newitem := *whiteprototype
以及返回時的&newitem
的作用是拷貝乙份whiteprototype
到返回值中。
測試中可以看到,首先獲取shirtcache例項,呼叫getclone方法獲得顏色為white的whiteprototype的拷貝,確認該拷貝不是原型本型(即item1 != whiteprototype
),再確認該拷貝確實屬於shirt
型別。重複以上步驟得到item2
,再斷言item1 != item2
,也就是根據同一原型產生的例項不應該相同,最後根據例項的記憶體位址確認兩者確實不是同一物件。
func testclone(t *testing.t)
item1, err := shirtcache.getclone(white)
if err != nil
if item1 == whiteprototype
shirt1, ok := item1.(*shirt)
if !ok
shirt1.sku = "abbcc"
item2, err := shirtcache.getclone(white)
if err != nil
shirt2, ok := item2.(*shirt)
if !ok
if shirt1.sku == shirt2.sku
if shirt1 == shirt2
t.logf("log: %s", shirt1.getinfo())
t.logf("log: %s", shirt2.getinfo())
t.logf("log: the memory positions of the shirts are different %p != %p \n\n", &shirt1, &shirt2)
}
完整**見
建立型模式 原型模式
使用原型例項指定建立物件的種類,並且通過轉殖這些原型建立新的物件 原理是將乙個原型物件傳給要發動建立的物件,該物件通過請求原型物件轉殖自己來建立過程 轉殖方法 public prototype clone jdk中為我們提供了轉殖的方法clone 從object繼承下來,乙個物件要實現轉殖,需要實現...
建立型模式 原型模式
原型 prototype 模式主要用於建立物件的轉殖,通常其最簡單的形式就是採用自定 clone 函式並 傳入物件引數以返回此物件的乙個副本,這在 python 實作上可使用內定 copy.cop y 或 copy.deepcopy 函式來達到此目的。當已有乙個物件但對此物件的某些部分會被變更卻又想...
原型模式 建立型模式
文章首發個人部落格 如果我們有乙個類 sheep 它裡面有兩個屬性,名稱 name 年齡 age 現在我們有乙個它的例項 s1 我們需要按照這個例項的屬性再去建立兩個物件。1 sheep data public class sheep 2 main public class main 原型模式 用原...