1. 基本概念

享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少对象的数量,通过共享已经存在的相似对象来减小内存占用和提高性能。享元模式适用于需要创建大量相似对象,但这些对象中的许多属性是可以共享的情况。

2. 适用场景

  • 当一个应用程序使用了大量相似对象,而这些对象占用大量内存时。
  • 当对象中有可共享的状态,而这些状态对于应用程序而言是相对稳定的。
  • 当创建新对象的代价较高,可以通过共享已有对象来减小创建的数量。

3. 优缺点

优点:

  • 减小内存占用: 通过共享相似对象的状态,减小了内存占用,提高了系统性能。
  • 提高性能: 由于共享了对象,减少了创建对象的数量,提高了系统性能。
  • 分离内部状态和外部状态: 将对象的状态分为内部状态和外部状态,内部状态可以被共享,而外部状态可以根据需要在运行时传递。

缺点:

  • 引入共享状态可能导致线程安全问题: 如果多个线程同时修改共享的状态,可能会引发线程安全问题,需要在使用时考虑线程安全。

4. 示例

考虑一个简单的文本编辑器的例子,其中有大量字符对象。在享元模式中,我们将字符的外部状态(位置、颜色等)和内部状态(字符的本身)分开,并通过共享相同的字符实例来减小内存占用。

package main

import "fmt"

// Flyweight Interface
type Character interface {
	Display() string
}

// ConcreteFlyweight
type ConcreteCharacter struct {
	character rune
}

func NewConcreteCharacter(character rune) *ConcreteCharacter {
	return &ConcreteCharacter{character: character}
}

func (c *ConcreteCharacter) Display() string {
	return fmt.Sprintf("Character: %c", c.character)
}

// FlyweightFactory
type CharacterFactory struct {
	characters map[rune]Character
}

func NewCharacterFactory() *CharacterFactory {
	return &CharacterFactory{characters: make(map[rune]Character)}
}

func (cf *CharacterFactory) GetCharacter(character rune) Character {
	if _, exists := cf.characters[character]; !exists {
		cf.characters[character] = NewConcreteCharacter(character)
	}
	return cf.characters[character]
}

// Client
func main() {
	characterFactory := NewCharacterFactory()

	text := "ABCABD"
	for _, char := range text {
		flyweight := characterFactory.GetCharacter(char)
		fmt.Println(flyweight.Display())
	}
}

在这个示例中,ConcreteCharacter表示具体的字符对象,CharacterFactory是享元工厂,负责创建和管理字符对象。客户端通过享元工厂获取字符对象,并显示它们的内容。通过共享相同的字符实例,减小了内存占用。


孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意

腾讯云开发者社区:孟斯特