java - 以对象参数为关键的享元设计模式?
问题描述
我正在尝试使用 Flyweight 设计模式减少 Book 对象的重复,但在某些时候卡住了。
例如,假设有一个 book 类,其中包含一些变量,例如 bookName、published_date 和 Langauge,并且有人创建了一个 book 实例:
bookName: ABC // published_date: 17-05-2020 // Langauge: English.
我想要做的是,当他克隆上面的同一本书实例时,我想减少重复。
但是,当我搜索享元模式时,它们都将 String 或 Integer 作为内在值/键。
例子:
class CoffeeFlavorFactory {
private Map<String, CoffeeFlavor> flavors = new HashMap<String, CoffeeFlavor>();
CoffeeFlavor getCoffeeFlavor(String flavorName) {
CoffeeFlavor flavor = flavors.get(flavorName);
if (flavor == null) {
flavor = new CoffeeFlavor(flavorName);
flavors.put(flavorName, flavor);
}
return flavor;
}
上面的代码将 String flavorName 作为内在值。
我想问的是,有没有办法将 Book 对象作为内在价值并使用享元模式?
提前致谢!
解决方案
您的问题听起来不像享元模式的预期使用场景,它是针对大量对象(使用重复属性/子对象构建)将重复需要的属性/子对象“外包”到中央内存结构然后当您的对象集合中的某个主要对象用于通过引用“外包”对象来重建它时。(在此处检查在此处输入链接描述
在您的示例中,如果它们是对象,您将外包 publishDate 和 Language 对象。
我理解您想要做的只是防止创建副本,如果已经注册了同一本书的实例。“同一本书”目前由三个属性(bookName、bookPublishingDate、bookLanguage)标识。
你可以用你的方法做到这一点,只有哈希图中的键应该从书的所有相关属性中聚合出来。
像
字符串 bookSignature = bookName+bookPublishingDate.toString()+bookLanguage;
如果您想节省内存,可以使用 StringBuilder 创建字符串。
推荐阅读
- python - PyInstaller + Wine + NLTK = WinError 127 "RtlIpv6AddressToStringA"。有任何想法吗?
- javascript - 将 Google Analytics(分析)客户端 ID 保存到变量的问题
- python - 将元组列表转换为字典并将计数信息添加为字典值
- regex - 它可以将 head、sed 和 regex 一起工作到一个 bash 脚本中吗?
- docker - SuperSet 验证 Web 浏览器
- javascript - Chai Expect 断言错误不可捕获
- c++ - 对 C++ 代码中的神经网络梯度下降部分感到困惑
- python - 如何从python将整数参数传递给R脚本
- c++ - 从 C++ 中的基本类型中抛弃 volatile
- c# - 没有 AreaAttribute 的 ASP.Net Core 区域路由和默认路由