7

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

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

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

谢谢!

4

5 回答 5

3

享元模式的Wikipedia 条目有一个具体的 Java 示例。

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

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

使用 Wiki 示例,CoffeeFlavorFactory将只创建任何给定的单个实例CoffeeFlavor(这是在第一次请求 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!");
}
于 2011-09-27T02:05:18.263 回答
1

要跟进 Brian 引用的维基百科示例……

通常,如果您想缓存一些对象(例如 CoffeeFlavors)并让它们在多个享元(CoffeeOrders)之间共享,那么您应该使它们静态可用。但这根本没有必要。重要的部分是 CoffeeOrder 在构建时被赋予共享对象。

如果订单总是只由一个单例创建,例如“CoffeeOrderFactory”,那么工厂可以保留 Flavors 的非静态缓存。无论您如何完成它,您的目标是让整个系统中的所有订单都使用相同的一组确切的 Flavor 对象。但归根结底,如果您想避免创建多个 CoffeeFlavor 实例,则通常需要静态创建它,以确保只有一个缓存。

得到它?

于 2011-09-27T03:00:16.963 回答
1

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

输入

  • 答:CE
  • B:直流
  • 丙:乙
  • 甲:乙

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

  • 答:公元前
  • 乙:光盘
  • 丙:乙

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

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

于 2011-09-27T03:04:25.710 回答
0

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

于 2011-09-27T03:04:39.670 回答
0

“java.lang.Character”使用享元模式来缓存所有 US-ASCII 字符:参见Character.valueOf()方法使用的类 java.lang.Character$CharacterCache

于 2014-01-09T10:14:27.863 回答