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