查看更多
当前 - 选择题 - 设计模式
中等
单选题
2015年5月第30题
#第二版教材
#了解即可

采用以下设计思路实现下图所示的目录浏览器:目录中的每个目录项被认定为一个类,其属性包括名称、类型(目录或文件)、大小、扩展名、图标等。为节省内存空间,要求不能将具有相同属性(例如类型、扩展名、图标相同)的相同文件看作不同的对象。能够满足这一要求的设计模式是(Flyweight)。

问题(1)
浓缩知识点

享元模式是一种用于优化内存占用的结构型设计模式,核心是通过共享具备相同内部状态的对象实例,减少系统中重复对象的数量。它将对象属性分为内部状态与外部状态,内部状态是不随使用场景变化、可被多个对象共享的固定属性,比如文件的类型、扩展名、图标;外部状态是随场景动态变化、不能共享的属性,比如文件名、存储路径、文件大小,这类状态通常由客户端在使用对象时传入。该模式适用于系统存在大量相似重复对象、内存开销过大的场景。需要注意的是,它和代理、命令、状态模式核心目标不同:代理模式聚焦对象的访问控制或延迟加载,命令模式侧重将请求封装为对象以支持撤销、排队等操作,状态模式是通过封装状态实现行为随状态动态切换,这些模式均不针对内存优化中的对象共享问题。

正确答案
A

本题考察的是享元模式(Flyweight) 在减少对象数量、共享不可变内部状态上的应用。

需求强调“有相同属性的相同文件不应当被当作不同对象”,即将类型、扩展名、图标等作为内部状态共享,将文件名、路径等作为外部状态在使用时注入,从而显著降低内存占用。

A选项 Flyweight:通过共享具有相同内部状态的对象来减少实例数,恰好满足“相同属性的文件共享为一个对象”的要求,正确。
B选项 Proxy:为目标对象提供一个代理以控制访问或延迟加载,侧重间接访问与控制,并不解决“相同对象共享、减少实例数”的问题,错误。
C选项 Command:将请求封装为对象以支持撤销、排队等行为,关注行为请求的封装,与共享对象以节省内存无关,错误。
D选项 State:将状态封装并在对象内部切换以改变行为,关注行为随状态变化而变化,不涉及跨对象共享内部不变数据来节省内存,错误。
因此,选择 A. Flyweight

联系我们
隐私协议
用户协议
微信公众号
知乎
小红书
浙ICP备2021029036号
@2022-2026
嘉兴市安芯网络科技有限公司 版权所有