中國建設銀行股份有限公司廣東seo網站設計
目錄
享元模式(Flyweight Pattern)
享元模式的核心角色:
優(yōu)缺點
使用場景
注意事項
代碼實現
享元模式(Flyweight Pattern)
????????享元模式(Flyweight Pattern)它通過共享對象來減少內存使用和提高性能。享元模式的核心思想是共享,當需要創(chuàng)建一個新對象時,首先檢查是否已經有與其相同的對象存在,如果存在,則直接返回該對象的引用;如果不存在,則創(chuàng)建一個新對象并將其加入對象池中以供下次使用。通過這種方式,可以避免重復創(chuàng)建相同的對象,從而減少內存占用和提高性能。
????????使用享元模式需要有兩個前提:(1)享元對象不可變:當享元模式創(chuàng)建出來后,它的變量和屬性不會被修改;(2)系統(tǒng)中存在大量重復對象:這些重復對象可以使用同一個享元,內存中只存在一份,這樣會節(jié)省大量空間。當然這也是為什么享元對象不可變的原因,因為有很多引用,變更的話會引起很多問題。
享元模式的核心角色:
- 享元工廠(Flyweight Factory):負責創(chuàng)建和管理享元對象。它維護一個享元池(Flyweight Pool),用于存儲已經創(chuàng)建的享元對象。
- 享元對象(Flyweight):表示可以共享的對象。享元對象通常包含內部狀態(tài)和外部狀態(tài)。內部狀態(tài)是不變的,可以被多個對象共享;外部狀態(tài)是可變的,每個對象都有自己的外部狀態(tài)。
優(yōu)缺點
(1)優(yōu)點:
- 縮小對象的創(chuàng)立,升高內存中對象的數量,升高零碎的內存,提高效率。
- 縮小內存之外的其余資源占用。
(2)缺點:
- 為了使對象可以共享,需要將一些不能共享的狀態(tài)外部化,這將增加程序的復雜性。
- 讀取享元模式的外部狀態(tài)會使得運行時間稍微變長。
使用場景
- 系統(tǒng)有大量相似對象。
- 需要緩沖池的場景。
注意事項
- (1)注意劃分外部狀態(tài)和內部狀態(tài),否則可能會引起線程安全問題。
- (2)這些類必須有一個工廠對象加以控制。
代碼實現
package mainimport "fmt"// 一個文字編輯器,需要處理大量的字符對象。每個字符對象都有自己的字體、大小和顏色等屬性。由于字符對象可能非常多,
// 如果每個字符對象都占用大量內存,將導致內存消耗過大。我們希望能夠通過共享相同屬性的字符對象,來減少內存使用。// 享元對象:字符對象
type Character struct {char runefont stringsize intcolor string
}func (c *Character) Display() {fmt.Printf("Character: %c, Font: %s, Size: %d, Color: %s\n", c.char, c.font, c.size, c.color)
}// 享元工廠:字符工廠
type CharacterFactory struct {characters map[rune]*Character
}func NewCharacterFactory() *CharacterFactory {return &CharacterFactory{characters: make(map[rune]*Character),}
}func (f *CharacterFactory) GetCharacter(char rune, font string, size int, color string) *Character {key := charif _, ok := f.characters[key]; !ok {f.characters[key] = &Character{char: char,font: font,size: size,color: color,}}return f.characters[key]
}// 客戶端代碼
func main() {factory := NewCharacterFactory()char1 := factory.GetCharacter('A', "Arial", 12, "Red")char1.Display()char2 := factory.GetCharacter('A', "Times New Roman", 14, "Blue")char2.Display()char3 := factory.GetCharacter('B', "Times New Roman", 14, "Blue")char3.Display()char4 := factory.GetCharacter('B', "Arial", 12, "Red")char4.Display()
}