设计模式-Flyweight

结构型模式

组成

Flyweight 模式通过共享对象,来有效地降低系统的实现成本,主要是降低存储成本、对象的创建成本。

UML 和组成 如下:

Flyweight: 享元对象的抽象接口;

ConcreteFlyweight:具体的享元对象;

Factory: 用于创建 Flyweight 对象的工厂,因为Flyweight对象要能够复用,所以不能每次由用户创建对象,只能通过唯一的入口来获取(创建)Flyweight对象,这个入口就是 FlyweightFactory。

因为创建的对象都是Flyweight对象,每个对象之间又存在差异(状态不同),所以Flyweight对象要有两个状态:外部状态和内部状态。内部状态是Flyweight对象自身的状态,不会被改变;外部状态是在使用Flyweight对象时,作为方法参数由外部环境传给Flyweight对象的。

Flyweight对象 是对重复对象消除外部状态后的创建的一个抽象,因此可以抽象成一个接口,具体的Flyweight对象则是接口的实现。

应用场景

在一些系统应用中,会创建大量的细粒度的、相似的对象,这些对象有着相似的组成结构,消除对象之间的差异后,这些对象可以表示为有限个基本对象集合。

对于这样的场景,可以使用 Flyweight模式,创建有限个基本对象(Flyweight对象),每次创建对象时都是复用已有的基本对象。

示例代码

Java 包装类 Integer 就使用了 享元模式,通过缓存 [-127,128] 之间的数,避免每次新建 Integer 对象。

java 复制代码
public static Integer valueOf(int i) {
    // i 在 -127 和 128 之间,使用已经存在的缓存数据
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

优点和缺点

使用 Flyweight 模式时,传输、查找和计算都会产生运行时的开销,节省的空间抵消了这些开销。

共享的 Flyweight 对象越多,节省的空间越大。

小结

Flyweight 通过重复使用已经存在的基本元素对象,减少重复创建对象的性能和空间损失。

Flyweight 对象和 枚举 的区别?

Flyweight对象和枚举很相似,都是用有限的集合来表示一些不会变的对象。但是,Flyweight对象和枚举是不一样的:

1、目的不一样

Flyweight对象是实现对象复用,从而降低存储和创建对象的成本;

枚举是对有限"取值"的描述,没有额外的效果。

2、含义不同

Flyweight对象本质上是"有状态的对象";

枚举是对一些固定值的描述,是没有"状态"的,一个枚举出现在任何一个地方,含义都是相同的,但 Flyweight 对象只有内部状态是相同的,外部状态是不一样的。

相关推荐
信徒_44 分钟前
SpringBoot 自动装配流程
java·spring boot·后端
景天科技苑1 小时前
【Rust闭包】rust语言闭包函数原理用法汇总与应用实战
开发语言·后端·rust·闭包·闭包函数·rust闭包·rust闭包用法
-曾牛10 小时前
基于微信小程序的在线聊天功能实现:WebSocket通信实战
前端·后端·websocket·网络协议·微信小程序·小程序·notepad++
Warren9811 小时前
Java面试八股Spring篇(4500字)
java·开发语言·spring boot·后端·spring·面试
背帆12 小时前
go的interface接口底层实现
开发语言·后端·golang
IT成长史13 小时前
deepseek梳理java高级开发工程师springboot面试题2
java·spring boot·后端
qq_2663487313 小时前
springboot AOP中,通过解析SpEL 表达式动态获取参数值
java·spring boot·后端
敲代码的 蜡笔小新13 小时前
【行为型之命令模式】游戏开发实战——Unity可撤销系统与高级输入管理的架构秘钥
unity·设计模式·架构·命令模式
m0_5557629013 小时前
D-Pointer(Pimpl)设计模式(指向实现的指针)
设计模式
小Mie不吃饭13 小时前
【23种设计模式】分类结构有哪些?
java·设计模式·设计规范