【搞懂设计模式】享元模式:共享节约,皆大欢喜!

简介: 【搞懂设计模式】享元模式:共享节约,皆大欢喜!

什么是享元模式

巧记:共享节约,皆大欢喜。

总结:享元模式是一种结构型设计模式,它通过共享技术有效地支持大量细粒度的对象。想象一个大家庭的餐桌,一顿饭需要的碗筷,如果每个人都自己带一套,那么需要的筷子和碗就会特别多,消耗的资源很大。但是如果大家都用公共的筷子和碗,就可以大大节省资源。这就是享元模式的原理。在计算机世界中,这种方式同样适用,尤其是在需要大量产生相同或相似对象的场景中,如线程池、连接池等,可以大大节约系统资源,提高效率。


享元模式是一种用于性能优化的模式,其核心思想是如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不需要为每一次使用都创建新的对象。


享元模式通过共享技术实现相同或相似对象的重用。 享元模式是结构型设计模式,它通过把内在状态(intrinsic state,相同部分)和外在状态(extrinsic state,不同部分)分离,通过共享创建实例,可以大幅度减少内存中对象的数量,从而达到节省内存的目的。

当一个程序使用了大量的对象,且大量的对象会导致很大的内存开销时,就可以考虑使用享元模式。

例子:围棋应用

假设我们是一个围棋应用的开发者,围棋中有黑白两色棋子,我们可以创建一个棋子的工厂,可以根据用户的需要给他们提供黑棋或者白棋,而无论多少用户,我们都只需要创建一个白棋和一个黑棋的实例就足够使用

package main

import "fmt"

// Color Type
type Color string

const (
    White Color = "white"
    Black       = "black"
)

// Piece Struct
type Piece struct {
    color Color
}

// PieceFactory Struct
type PieceFactory struct {
    pieces map[Color]*Piece
}

func (f *PieceFactory) GetPiece(color Color) *Piece {
    p, ok := f.pieces[color]
    if !ok {
        p = &Piece{color: color}
        f.pieces[color] = p
    }
    return p
}

func NewPieceFactory() *PieceFactory {
    return &PieceFactory{
        pieces: make(map[Color]*Piece),
    }
}

func main() {
    factory := NewPieceFactory()

    piece1 := factory.GetPiece(Black)
    fmt.Printf("Get piece: %v\n", piece1)

    piece2 := factory.GetPiece(White)
    fmt.Printf("Get piece: %v\n", piece2)

    piece3:= factory.GetPiece(Black)
    fmt.Printf("Get piece: %v\n", piece3)

    if piece1 == piece3 {
        fmt.Println("Same piece")
    } else {
        fmt.Println("Different piece")
    }
}

在这个例子中以看到,尽管用户调用了多次获取棋子的函数,但对同颜色的棋子,系统只创建了一个实例。

在享元模式中,有两种状态:

  1. 内部状态(Intrinsic State):在享元对象内部且不会随环境改变而改变的共享部分,例如我们棋盘游戏的黑白棋子之间的颜色。
  2. 外部状态(Extrinsic State):随环境改变而改变的、不可共享的状态,例如棋子的位置。

总结

总而言之,享元模式在如下场景中比较适用:

  • 一个应用使用了大量的对象。
  • 完全由于使用了大量的对象,造成很大的内存开销。
  • 对象的大多数状态都可以变为外部状态。
  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 程序设计得当,可以在运行时刻需要时新建对象。

如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的经验~

相关文章
|
5天前
|
设计模式 存储 缓存
「全网最细 + 实战源码案例」设计模式——享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少大量相似对象的内存消耗。通过分离对象的内部状态(可共享、不变)和外部状态(依赖环境、变化),它有效减少了内存使用。适用于存在大量相似对象且需节省内存的场景。模式优点包括节省内存和提高性能,但会增加系统复杂性。实现时需将对象成员变量拆分为内在和外在状态,并通过工厂类管理享元对象。
136 83
|
5月前
|
设计模式 Java
Java设计模式-享元模式(12)
Java设计模式-享元模式(12)
|
6月前
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)
|
7月前
|
设计模式 存储 JavaScript
js设计模式【详解】—— 享元模式
js设计模式【详解】—— 享元模式
82 6
|
8月前
|
设计模式 缓存 Java
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
|
8月前
|
设计模式 存储 Java
Java设计模式之享元模式详解
Java设计模式之享元模式详解
|
8月前
|
设计模式
享元模式-大话设计模式
享元模式-大话设计模式
|
9月前
|
设计模式 存储 Java
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
|
2月前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
125 11
|
3月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式