Java中的Flyweight示例

Java中的Flyweight示例,java,flyweight-pattern,Java,Flyweight Pattern,我正在尝试用Java创建一个flyweight对象。我在Objective-C中使用过类似的概念(Objective-C中的单例类//我相信它们是一样的) 我试图在网上找到一个教程、一个例子或解释来学习如何创建一个flyweight对象并使用它,但我在谷歌上搜索了一下,却找不到任何东西。我浏览了10页,他们基本上都是从一个网站上剽窃的,这个网站只是解释了这个概念。我理解这个概念——我需要一些东西来帮助我/教我如何用Java实现它 有人有什么建议/教程吗 谢谢 有一个具体的Java示例 编辑以尝试

我正在尝试用Java创建一个flyweight对象。我在Objective-C中使用过类似的概念(Objective-C中的单例类//我相信它们是一样的)

我试图在网上找到一个教程、一个例子或解释来学习如何创建一个flyweight对象并使用它,但我在谷歌上搜索了一下,却找不到任何东西。我浏览了10页,他们基本上都是从一个网站上剽窃的,这个网站只是解释了这个概念。我理解这个概念——我需要一些东西来帮助我/教我如何用Java实现它

有人有什么建议/教程吗

谢谢

有一个具体的Java示例

编辑以尝试帮助OP了解模式:

正如我在下面的评论中所指出的,flyweight模式的要点是,您正在共享某个对象的单个实例,而不是创建新的、相同的对象

使用Wiki示例,
CoffeeFlavorFactory
将只创建任何给定
CoffeeFlavor
的单个实例(这是在第一次请求风味时完成的)。对相同风格的后续请求返回对原始单个实例的引用

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!");
}

为了跟进Brian引用的Wikipedia示例

通常,如果要缓存某些对象(如咖啡口味)并在多个Flyweight(咖啡订单)之间共享它们,则可以使它们静态可用。但这根本没有必要重要的一点是,咖啡订单在构建时会被赋予共享对象。

如果订单总是只由一个单例创建,比如“CoffeeOrderFactory”,那么工厂可以保留一个非静态的口味缓存。无论您如何完成它,您的目标都是获得整个系统中的所有命令,以使用相同的精确风味对象集。但是在一天结束的时候,如果你想避免创建很多CoffeeFlavor实例,那么通常需要静态地创建它,以确保只有一个缓存


明白了吗?

我有这个案子。我想我的解决方案是飞锤

输入
  • A:CE
  • B:DC
  • C:E
  • A:B
它要求我创建一棵树,并按名称对其子树进行排序。大概是这样的:

  • A:B:C:E
  • B:CD
  • 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;
}

这是实际问题的简化版本,但您现在应该已经有了想法。

我还找到了一个示例,它有很好的Java代码示例。

Java.lang.Character”使用flyweight模式缓存所有US-ASCII字符:请参见该方法使用的类中的Java.lang.Character$CharacterCache,分配对象时,对其调用static只会使其成为flyweight?呃,不是吗?flyweight模式的要点是,您正在共享某个对象的单个实例,而不是创建新的、相同的对象。Wiki中给出的示例演示了这一点;没有静电干扰。工厂仅在第一次请求特定风味时创建咖啡风味的新实例。在这之后,它返回对flavor的单个实例的引用<代码>与flyweight对象无关的静态CoffeeFlavor[/flavors。这只是在他们的测试类中显示功能。对。但区别在于工厂本身不是一个单例(在本例中);如果您实例化了两个工厂,您(可能)会有一个给定风格的多个实例。把工厂变成一个单身汉当然可以解决这个问题。这和我现在做的非常相似。我正在创建一个四叉树。节点类是一个抽象类。空叶节点是flyweight对象。
JTable
就是一个很好的例子。下面是对flyweight模式的解释: