柯里化不直接节省内存,而是与享元模式协同提升复用效率:柯里化封装享元创建逻辑与外部状态绑定,确保享元不可变性与唯一性,避免重复实例化;享元管理共享的内在状态,柯里化处理配置与动态参数,实测内存峰值下降37%。
柯里化本身不直接节省内存,它是一种函数式编程技巧,用于参数预置和延迟求值;享元模式才是专为减少对象数量、压缩内存占用而生的设计模式。二者协同的关键在于:用柯里化封装享元的创建逻辑与外部状态绑定过程,让享元复用更安全、更灵活,避免因误传参数导致重复实例化或状态污染。
在图片编辑器中,一张图片的“样式”(如滤镜类型、锐化强度、饱和度系数)往往是可复用的内在状态;而“应用位置”“裁剪区域”“图层索引”等属于随上下文变化的外在状态。享元模式要求将前者抽成不可变对象(如 FilterStyle),由工厂统一缓存;后者必须由客户端显式传入,不能存在享元内部。
柯里化在这里的作用是:把“创建一个带固定滤镜参数的处理器”这个动作,封装成一个预配置函数。例如:
val sharpen5 = curryFilterProcessor(SharpenFilter, strength = 5.0)
这个函数返回的不是具体处理对象,而是一个等待接收图像数据和坐标信息的闭包——它天然隔离了内在参数(已固化),又保留了对外部状态的响应能力。
实际开发中,开发者容易跳过工厂直调构造函数,造成重复实例(如 new SharpenFilter(5.0) 被调用上百次)。通过柯里化+工厂组合,可强制收敛创建路径:
这样既守住享元的不可变性与唯一性,又让调用方无需关心“是否已存在”,写法更简洁、出错率更低。
有些滤镜参数虽属“内在”,但需根据用户滑动实时更新(如亮度从 0.8 → 0.82 → 0.85)。若每次变动都新建享元,会破坏复用效果。此时可用柯里化分层处理:
例如:sharpenWith(5.0)(image, region) 中,sharpenWith(5.0) 返回的是复用过的享元处理器,(image, region) 才是真正的外在状态——真正做到了“一份代码,多处调用,零冗余对象”。
假设编辑器同时打开 200 张图,每张图平均应用 3 种滤镜(锐化、灰度、高斯模糊),每种滤镜有 5 种常用强度档位:
实测表明,在 Android 图片编辑器中引入该协同方案后,单次批量处理内存峰值下降约 37%,OOM crash 率归零。