享元设计模式以对象参数为键?

Flyweight design pattern getting Object parameter as its key?

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

例如,假设有一本书class,其中包含一些变量,例如bookName,published_date和Langauge,并且有人创建了一个书实例:

bookName: ABC // published_date: 17-05-2020 // Langauge: English.

我想做的是,当他克隆上面的同一本书实例时,我想减少重复。

但是,当我搜索享元模式时,它们都将字符串或整数作为内在值/键。

示例:

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对象作为内在值,使用享元模式吗?

提前致谢!

你的问题听起来不像享元模式的预期使用场景,享元模式适用于大量对象(使用重复 attributes/child 对象构建)到 "outsource" 重复需要的对象 attributes/child 对象到中央内存结构,然后当您的对象集合中的某个主要对象用于通过引用 "outsourced" 对象来重建它时。 (在这里查看 enter link description here
在您的示例中,如果它们是对象,您将外包 publishDate 和 Language 对象。

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

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

喜欢

String bookSignature = bookName+bookPublishingDate.toString()+bookLanguage;

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