我想用以下属性创建一个名为A的对象。
public class A {
private Object data;
public A(Object data) {
this.data = data;
}
}
如何设置此对象,以便如果两个实例具有相同的数据值,那么它们会引用相同的实例?我正在创建一个非常昂贵的对象,不需要重复。
答案 0 :(得分:3)
您想要的是实例控件:您希望以受控方式创建实例。
您可以使用工厂模式实现此目的。拥有一个工厂,它保留唯一值的缓存,映射到昂贵的对象。使用除工厂之外的任何其他方法禁用对象创建。当从工厂请求实例时,检查它是否在缓存中,如果是,则返回它。否则,创建一个新对象,将其放入缓存中并返回它。这是一般的想法。
答案 1 :(得分:1)
如果Object data
是更细粒度的组合,您可以结合使用
有工厂的Flyweight pattern。 @Janos已经描述了工厂和缓存机制,所以这里有一个关于如何一起使用它们的简要教程:
Flyweight Pattern in Java Tutorial(请完整阅读该文章)
当我们需要创建很多时,使用Flyweight设计模式 一类的对象。由于每个对象都占用了可以的内存空间 对于低内存设备至关重要,例如移动设备或嵌入式设备 系统,可以应用flyweight设计模式来减少负载 通过共享对象来记忆
- 应用程序要创建的对象数量应该很大。
- 对象创建对内存很重要,也很耗时。
- 对象属性可以分为内在属性和外在属性,对象的外在属性应该是 由客户端程序定义。
...客户端程序将使用flyweight工厂来实例化Object,因此我们需要在工厂中保留一个客户端应用程序无法访问的Objects映射。每当客户端程序调用获取Object的实例时,它应该从HashMap返回,如果没有找到,则创建一个新的Object并放入Map然后返回它。我们需要确保在创建Object时考虑所有内在属性。