我正在尝试在 Java 中创建一个享元对象。我在 Objective-C 中使用过类似的概念(Objective-C 中的单例类 // 我相信它们是同一回事)。
我正在尝试在线查找教程或示例或解释,以了解如何创建享元对象并使用它,但我在 Google 上搜索过,但找不到任何下降。我浏览了 10 页,它们基本上都抄袭了一个网站,该网站只是解释了这个概念。我理解这个概念——我需要一些东西来帮助我/教我如何在 Java 中实现它。
有人有任何建议/教程吗?
谢谢!
我正在尝试在 Java 中创建一个享元对象。我在 Objective-C 中使用过类似的概念(Objective-C 中的单例类 // 我相信它们是同一回事)。
我正在尝试在线查找教程或示例或解释,以了解如何创建享元对象并使用它,但我在 Google 上搜索过,但找不到任何下降。我浏览了 10 页,它们基本上都抄袭了一个网站,该网站只是解释了这个概念。我理解这个概念——我需要一些东西来帮助我/教我如何在 Java 中实现它。
有人有任何建议/教程吗?
谢谢!
享元模式的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!");
}
要跟进 Brian 引用的维基百科示例……
通常,如果您想缓存一些对象(例如 CoffeeFlavors)并让它们在多个享元(CoffeeOrders)之间共享,那么您应该使它们静态可用。但这根本没有必要。重要的部分是 CoffeeOrder 在构建时被赋予共享对象。
如果订单总是只由一个单例创建,例如“CoffeeOrderFactory”,那么工厂可以保留 Flavors 的非静态缓存。无论您如何完成它,您的目标是让整个系统中的所有订单都使用相同的一组确切的 Flavor 对象。但归根结底,如果您想避免创建多个 CoffeeFlavor 实例,则通常需要静态创建它,以确保只有一个缓存。
得到它?
我得到了这个案子。我认为我的解决方案是轻量级。
它要求我创建一棵树并按名称对其子级进行排序。像这样的东西:
这实际上是一项简单的任务。但请注意,输入中的第一个“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”使用享元模式来缓存所有 US-ASCII 字符:参见Character.valueOf()方法使用的类 java.lang.Character$CharacterCache