创建支持实习的对象的良好模式?

时间:2011-08-12 04:42:35

标签: java oop design-patterns

我需要一个支持实习的类,比如Java的String类。在创建Class的实例时,如果已存在具有相同参数的引用,则应返回预先存在的引用。否则它应该返回一个新的引用。这样:

Foo a = new Foo(5);
Foo b = new Foo(5);
Foo c = new Foo(6);
a == b
a != c

1)工厂的工作是维护预先存在的对象表,还是表通常只是类本身的静态变量?

2)预先存在的对象表是什么?它是每次请求实例时搜索的一组对象,还是一个Map,其中键是对象,值是参数?

3 个答案:

答案 0 :(得分:2)

我想到了两件事

  1. Flyweight Pattern

  2. Guava's ComputingMap

答案 1 :(得分:1)

如果您可以添加第三方依赖项,请考虑Google Guava及其Interners类。它有两个简单的插播器:WeakInternerStrongInternerStrongInternerConcurrentMap支持,最适合一小组封闭的值。如果您无法控制或以任何方式限制被拘禁的内容,那么您可以选择WeakInterner,这取决于WeakReference。使用WeakInterner的权衡是性能。

答案 2 :(得分:0)

您无法使用new运算符执行此操作,该运算符不会重复使用现有对象。工厂是最好的方法。 (它可以像类的静态newInstance方法一样简单。)通常的数据结构是某种类型的Map(通常是HashMap)。套装会贵得多。根据对象的数量,您可以只使用数组。 (我想这可能是Byte所做的。)

请注意,不会自动中断String对象,并且当您调用intern时,它可能会返回不同的String实例。例如,此代码将打印“false”:

String a = new String("hello");
String b = new String("hello");
a.intern();
b.intern();
System.out.println(a == b ? "true" : "false");