繁体   English   中英

享元设计模式以 Object 参数为关键?

[英]Flyweight design pattern getting Object parameter as its key?

我正在尝试使用 Flyweight 设计模式减少 Book 对象的重复,但在某些时候卡住了。

例如,假设有一本书 class 包含一些变量,例如 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 object 作为内在价值并使用享元模式?

提前致谢!

您的问题听起来不像享元模式的预期使用场景,它是针对大量对象(使用重复属性/子对象构建)将重复需要的属性/子对象“外包”到中央 memory 结构然后当您的对象集合中的某个主要 object 用于通过引用“外包”对象来重建它时。 (检查这里输入链接描述这里
在您的示例中,如果它们是对象,您将外包 publishDate 和 Language 对象。

我理解您想要做的只是防止创建副本,如果已经注册了同一本书的实例。 “同一本书”目前由三个属性(bookName、bookPublishingDate、bookLanguage)标识。

你可以用你的方法做到这一点,只有 hashmap 中的键应该从书中的所有相关属性中聚合出来。

喜欢

字符串 bookSignature = bookName+bookPublishingDate.toString()+bookLanguage;

如果要保存 memory,可以使用 StringBuilder 创建字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM