享元设计模式以对象参数为键?
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 创建字符串。
我正在尝试使用享元设计模式来减少 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 创建字符串。