首页 > 解决方案 > 以对象参数为关键的享元设计模式?

问题描述

我正在尝试使用 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 对象作为内在价值并使用享元模式?

提前致谢!

标签: javadesign-patternsflyweight-pattern

解决方案


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

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

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

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

如果您想节省内存,可以使用 StringBuilder 创建字符串。


推荐阅读