我正在尝试用Java创建一个flyweight对象。我在Objective-C中使用了类似的概念(Objective-C中的Singleton类//我相信它们是相同的东西)。
我正在尝试在线查找教程或示例或解释,以了解如何创建flyweight对象并使用它,但我在Google上搜索过,我找不到任何血统。我浏览了10页,他们基本上都是从一个网站抄袭,这个网站只是解释了这个概念。我理解这个概念 - 我需要一些东西来帮助我/教我如何用Java实现它。
任何人都有任何建议/教程?
谢谢!
答案 0 :(得分:3)
Wikipedia entry for the flyweight pattern有一个具体的Java示例。
编辑尝试帮助OP理解模式:
正如我在下面的评论中所指出的,flyweight模式的要点是你要共享一个事物的单个实例,而不是创建新的,相同的对象。
使用Wiki示例,CoffeeFlavorFactory
将只创建任何给定CoffeeFlavor
的单个实例(这是在第一次请求Flavor时完成的)。对相同flavor的后续请求将返回对原始单个实例的引用。
public static void main(String[] args)
{
flavorFactory = new CoffeeFlavorFactory();
CoffeeFlavor a = flavorFactory.getCoffeeFlavor("espresso");
CoffeeFlavor b = flavorFactory.getCoffeeFlavor("espresso");
CoffeeFlavor c = flavorFactory.getCoffeeFlavor("espresso");
// This is comparing the reference value, not the contents of the objects
if (a == b && b == c)
System.out.println("I have three references to the same object!");
}
答案 1 :(得分:1)
跟进Brian引用的维基百科示例......
通常,如果要缓存某些对象(例如CoffeeFlavor)并让它们在多个flyweights(CoffeeOrders)之间共享,那么您可以使它们静态可用。但这根本不是必要的。 重要的是,CoffeeOrders在构建时会被赋予共享对象。
如果Orders总是只由一个单例创建,比如“CoffeeOrderFactory”,那么工厂可以保留Flavors的非静态缓存。无论如何,您的目标是让整个系统中的所有Orders使用相同的Flavor对象集。但是在一天结束时,如果你想避免创建很多CoffeeFlavor实例,那么通常需要静态创建,只是为了确保只有一个缓存。
得到它?
答案 2 :(得分:1)
我得到了这个案子。我认为我的解决方案是轻量级。
它要我创建一棵树并按名称对其子项进行排序。像这样:
实际上这是一项简单的任务。但请注意,输入中的第一个“A”和第二个“A”必须引用相同的对象。因此我编写了类似这样的内容
public Node add(String key){
Node node = nodes.get(key);
if (null == node){
node = new Node(key);
nodes.put(key, node);
}
return node;
}
这是实际问题的简化版本,但您现在应该有这个想法。
答案 3 :(得分:0)
我还发现了this示例,它具有良好的Java代码示例。
答案 4 :(得分:0)
“java.lang.Character”使用flyweight模式来缓存所有US-ASCII字符:请参阅类{java}中使用Character.valueOf()方法使用的类java.lang.Character $ CharacterCache