最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go設(shè)計模式之享元模式講解和代碼示例

 更新時間:2023年06月28日 08:22:42   作者:demo007x  
享元是一種結(jié)構(gòu)型設(shè)計模式,它允許你在消耗少量內(nèi)存的情況下支持大量對象,模式通過共享多個對象的部分狀態(tài)來實現(xiàn)上述功能,換句話來說,享元會將不同對象的相同數(shù)據(jù)進行緩存以節(jié)省內(nèi)存,本文就將通過代碼示例給大家詳細介紹一下享元模式

Go 享元模式講解和代碼示例

概念示例

在游戲 《反恐精英》 中, 恐怖分子和反恐精英身著不同類型的衣物。 為了簡便起見, 我們就假設(shè)雙方都各有一種服裝類型。 服裝對象嵌入在玩家對象之中, 如下所示。

下面是玩家的結(jié)構(gòu)體。 我們可以看到, 服裝對象是嵌入在玩家結(jié)構(gòu)體之中的:

type player struct {
  dress      dress
  playerType string // 可為 T 或 CT
  lat        int
  long       int
}

假設(shè)目前有 5 名恐怖分子和 5 名反恐精英, 一共是 10 名玩家。 那么關(guān)于服裝, 我們就有兩個選項了。

  • 10 個玩家對象各自創(chuàng)建不同的服裝對象, 并將其嵌入。 總共會創(chuàng)建 10 個服裝對象。
  • 我們創(chuàng)建兩個服裝對象:
  • 單一恐怖分子服裝對象: 其將在 5 名恐怖分子之間共享。
  • 單一反恐精英服裝對象: 其將在 5 名反恐精英之間共享。

你可以看到, 方法 1 中我們總共創(chuàng)建了 10 個服裝對象; 方法 2 中則只有 2 個服裝對象。 第二種方法, 就是我們所遵循的享元設(shè)計模式。 我們所創(chuàng)建的 2 個服裝對象被稱為是享元對象。

享元模式會從對象中提取出公共部分并創(chuàng)建享元對象。 這些享元對象 (服裝) 隨后可在多個對象 (玩家) 中分享。 這極大地減少了服裝對象的數(shù)量, 更棒的是即便你創(chuàng)建了更多玩家, 也只需這么兩個服裝對象就足夠了。

在享元模式中, 我們會將享元對象存儲在 map 容器中。 每當(dāng)創(chuàng)建共享享元對象的其他對象時, 都會從 map 容器中獲取享元對象。

下面讓我們來看看此類安排的內(nèi)部狀態(tài)和外部狀態(tài):

  • 內(nèi)部狀態(tài): 內(nèi)部狀態(tài)的服裝可在多個恐怖分子和反恐精英對象間共享。
  • 外部狀態(tài): 玩家位置和玩家所使用的武器就是外部狀態(tài), 因為其在每個對象中都是不同的。

dressFactory.go: 享元工廠

package main
import "fmt"
const (
	//TerroristDressType terrorist dress type
	TerroristDressType = "tDress"
	//CounterTerrroristDressType terrorist dress type
	CounterTerrroristDressType = "ctDress"
)
var (
	dressFactorySingleInstance = &DressFactory{
		dressMap: make(map[string]Dress),
	}
)
type DressFactory struct {
	dressMap map[string]Dress
}
func (d *DressFactory) getDressFactoryByType(dressType string) (Dress, error) {
	if d.dressMap[dressType] != nil {
		return d.dressMap[dressType], nil
	}
	if dressType == TerroristDressType {
		d.dressMap[dressType] = newTerrorisDress()
		return d.dressMap[dressType], nil
	}
	if dressType == CounterTerrroristDressType {
		d.dressMap[dressType] = newCounterTerrroristDress()
		return d.dressMap[dressType], nil
	}
	return nil, fmt.Errorf("Wrong dress type passed")
}
func getDressFactorySingleInstance() *DressFactory {
	return dressFactorySingleInstance
}

dress.go: 享元接口

package main
// 享元接口
type Dress interface {
	getColor() string
}

terroristDress.go: 具體享元對象

package main
type TerroristDress struct {
	color string
}
func (t *TerroristDress) getColor() string {
	return t.color
}
func newTerrorisDress() *TerroristDress {
	return &TerroristDress{color: "red"}
}

counterTerroristDress.go: 具體享元對象

package main
// 享元接口
type CounterTerrroristDress struct {
	color string
}
func (c *CounterTerrroristDress) getColor() string {
	return c.color
}
func newCounterTerrroristDress() *CounterTerrroristDress {
	return &CounterTerrroristDress{color: "green"}
}

player.go: 背景

package main
type Player struct {
	dress      Dress
	playerType string
	lat        int
	long       int
}
func newPlayer(playerType, dressType string) *Player {
	dress, _ := getDressFactorySingleInstance().getDressFactoryByType(dressType)
	return &Player{
		dress:      dress,
		playerType: playerType,
	}
}
func (p *Player) newLocation(lat, long int) {
	p.lat = lat
	p.long = long
}

game.go: 客戶端代碼

package main
type game struct {
	terrorists        []*Player
	counterTerrorists []*Player
}
func newGame() *game {
	return &game{
		terrorists:        make([]*Player, 1),
		counterTerrorists: make([]*Player, 01),
	}
}
func (c *game) addTerrorist(dressType string) {
	player := newPlayer("T", dressType)
	c.terrorists = append(c.terrorists, player)
	return
}
func (c *game) addCounterTerrorist(dressType string) {
	player := newPlayer("CT", dressType)
	c.counterTerrorists = append(c.counterTerrorists, player)
	return
}

main.go: 客戶端代碼

package main
import "fmt"
func main() {
	game := newGame()
	//Add Terrorist
	game.addTerrorist(TerroristDressType)
	game.addTerrorist(TerroristDressType)
	game.addTerrorist(TerroristDressType)
	game.addTerrorist(TerroristDressType)
	//Add CounterTerrorist
	game.addCounterTerrorist(CounterTerrroristDressType)
	game.addCounterTerrorist(CounterTerrroristDressType)
	game.addCounterTerrorist(CounterTerrroristDressType)
	dressFactoryInstance := getDressFactorySingleInstance()
	for dressType, dress := range dressFactoryInstance.dressMap {
		fmt.Printf("DressColorType: %s\nDressColor: %s\n", dressType, dress.getColor())
	}
}

output.txt: 執(zhí)行結(jié)果

DressColorType: tDress
DressColor: red
DressColorType: ctDress
DressColor: green

到此這篇關(guān)于Go設(shè)計模式之享元模式講解和代碼示例的文章就介紹到這了,更多相關(guān)Go 享元模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang收支記賬程序詳細編寫過程

    Golang收支記賬程序詳細編寫過程

    這篇文章主要介紹了Golang實現(xiàn)收支記賬程序流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • go原子級內(nèi)存操作實現(xiàn)

    go原子級內(nèi)存操作實現(xiàn)

    原子級內(nèi)存操作是在多線程并發(fā)執(zhí)行時,能夠確保某個內(nèi)存操作是不可中斷的操作,本文主要介紹了go原子級內(nèi)存操作實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Go?chassis云原生微服務(wù)開發(fā)框架應(yīng)用編程實戰(zhàn)

    Go?chassis云原生微服務(wù)開發(fā)框架應(yīng)用編程實戰(zhàn)

    這篇文章主要為大家介紹了Go?chassis云原生微服務(wù)開發(fā)框架應(yīng)用編程實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Go語言七篇入門教程四通道及Goroutine

    Go語言七篇入門教程四通道及Goroutine

    這篇文章主要為大家介紹了Go語言的通道及Goroutine示例詳解,本文是Go語言七篇入門系列篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • GoLang協(xié)程庫libtask學(xué)習(xí)筆記

    GoLang協(xié)程庫libtask學(xué)習(xí)筆記

    libtask一個C語言的協(xié)程庫,是go語言的前身很早期的原型. 測試機器是我的mac air 安裝的centos虛擬機(只有一個核), 代碼沒有采用任何優(yōu)化,只是使用默認(rèn)配置
    2022-12-12
  • 詳解Go語言如何對數(shù)據(jù)庫進行CRUD操作

    詳解Go語言如何對數(shù)據(jù)庫進行CRUD操作

    在這篇文章中,主要帶大家來學(xué)習(xí)一下在Go語言中如何對數(shù)據(jù)庫進行CRUD操作,從而探討一下Go的接口編程,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • go-zero?rpc分布式微服務(wù)使用詳解

    go-zero?rpc分布式微服務(wù)使用詳解

    文章介紹了如何安裝Go環(huán)境、配置Go環(huán)境、安裝goctl工具以及創(chuàng)建第一個項目,詳細的步驟包括生成項目、配置文件、啟動服務(wù)、測試項目等,文章還涵蓋了Go?Zero框架的基本概念,如API定義、服務(wù)間通信、業(yè)務(wù)邏輯實現(xiàn)等
    2026-01-01
  • 在ubuntu下安裝go開發(fā)環(huán)境的全過程

    在ubuntu下安裝go開發(fā)環(huán)境的全過程

    Go語言是谷歌公司開發(fā)的編程語言,雖然安裝和配置go很簡單,但是很多初學(xué)者在第一次安裝go環(huán)境時會遇到各種坑,下面這篇文章主要給大家介紹了關(guān)于在ubuntu下安裝go開發(fā)環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 詳解Golang實現(xiàn)請求限流的幾種辦法

    詳解Golang實現(xiàn)請求限流的幾種辦法

    這篇文章主要介紹了詳解Golang實現(xiàn)請求限流的幾種辦法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Golang導(dǎo)入包的幾種方式(點,別名與下劃線)

    Golang導(dǎo)入包的幾種方式(點,別名與下劃線)

    這篇文章主要介紹了Golang導(dǎo)入包的幾種方式(點,別名與下劃線),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論

襄垣县| 枞阳县| 皮山县| 休宁县| 眉山市| 赞皇县| 凌云县| 措美县| 眉山市| 外汇| 藁城市| 新泰市| 宁陕县| 天台县| 宜城市| 禹城市| 来宾市| 贵州省| 合阳县| 广饶县| 搜索| 莒南县| 余江县| 庆安县| 绥芬河市| 仁布县| 南川市| 曲阜市| 乌兰浩特市| 利津县| 邯郸市| 左云县| 固安县| 开江县| 宿松县| 若尔盖县| 青海省| 商城县| 南和县| 宁阳县| 手游|