Java中的Flyweight示例

时间:2011-09-27 02:00:38

标签: java flyweight-pattern

我正在尝试用Java创建一个flyweight对象。我在Objective-C中使用了类似的概念(Objective-C中的Singleton类//我相信它们是相同的东西)。

我正在尝试在线查找教程或示例或解释,以了解如何创建flyweight对象并使用它,但我在Google上搜索过,我找不到任何血统。我浏览了10页,他们基本上都是从一个网站抄袭,这个网站只是解释了这个概念。我理解这个概念 - 我需要一些东西来帮助我/教我如何用Java实现它。

任何人都有任何建议/教程?

谢谢!

5 个答案:

答案 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)

我得到了这个案子。我认为我的解决方案是轻量级。

INPUT

  • A:C E
  • B:D C
  • C:E
  • A:B

它要我创建一棵树并按名称对其子项进行排序。像这样:

  • A:B C E
  • B:C D
  • C:E

实际上这是一项简单的任务。但请注意,输入中的第一个“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