原型模式

概念

原型模式(prototype), 用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象。

原型模式其實(shí)就是從一個(gè)對(duì)象再創(chuàng)建另一個(gè)可定制的對(duì)象(深拷貝), 新對(duì)象使用者不知道任何創(chuàng)建的細(xì)節(jié)。

具體實(shí)現(xiàn):

  1. 創(chuàng)建一個(gè)結(jié)構(gòu)體, 結(jié)構(gòu)體封裝一個(gè)深copy方法, 返回一個(gè)新的對(duì)象(這個(gè)時(shí)候數(shù)據(jù)沒變,原來的結(jié)構(gòu)體變量地址變了)。

模式的場(chǎng)景和優(yōu)缺點(diǎn)

使用場(chǎng)景

一個(gè)對(duì)象需要提供給其他對(duì)象訪問,而且各個(gè)調(diào)用者可能都需要修改其值時(shí),可以考慮使用原型模式拷貝多個(gè)對(duì)象供調(diào)用者使用

優(yōu)點(diǎn)

1、性能提高

2、逃避構(gòu)造函數(shù)的約束

缺點(diǎn)

配備克隆方法需要對(duì)類的功能進(jìn)行通盤考慮,這對(duì)于全新的類不是很難,但對(duì)于已有的類不一定很容易,特別當(dāng)一個(gè)類引用不支持串行化的間接對(duì)象,或者引用含有循環(huán)結(jié)構(gòu)的時(shí)候

代碼實(shí)現(xiàn)


package main

import "fmt"

// Example 示例結(jié)構(gòu)體
type Example struct {
    Content string
}

// Clone ...
func (e *Example) Clone() *Example {
    // golang 深拷貝, 拷貝數(shù)據(jù), 創(chuàng)建一個(gè)新的對(duì)象, 申請(qǐng)了新的內(nèi)存, 內(nèi)存不同。 淺拷貝, 直接復(fù)制指向?qū)ο蟮闹羔槪?新老對(duì)象的指向的地址一樣。
    res := *e
    return &res
}

func main() {
    var e *Example
    var eClone *Example
    e = &Example{
        Content: "Example",
    }
    fmt.Printf("e:%p,Content:%s\n", e, e.Content)

    eClone = e.Clone()
    fmt.Printf("clone e:%p,Content:%s\n", eClone, eClone.Content)
}



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容