对象复用实现方式
- 对象池技术:
- 创建一个对象池类,用于管理可复用的对象。在频繁创建和销毁小型对象的场景下,预先创建一定数量的对象并放入池中。当需要使用对象时,从池中获取;使用完毕后,将对象返回池中,而不是销毁它。
- 示例代码如下:
import java.util.ArrayList;
import java.util.List;
class SmallObject {
// 小型对象的具体实现
}
class ObjectPool {
private List<SmallObject> pool;
private int initialSize;
public ObjectPool(int initialSize) {
this.initialSize = initialSize;
pool = new ArrayList<>(initialSize);
for (int i = 0; i < initialSize; i++) {
pool.add(new SmallObject());
}
}
public SmallObject getObject() {
if (pool.isEmpty()) {
// 如果池为空,可以选择创建新对象或者等待其他对象返回
return new SmallObject();
}
return pool.remove(pool.size() - 1);
}
public void returnObject(SmallObject object) {
pool.add(object);
}
}
- 单例模式优化:如果小型对象是无状态的,并且整个应用程序只需要一个实例,可以使用单例模式。单例模式确保一个类只有一个实例,并提供一个全局访问点。
class StatelessSmallObject {
private static StatelessSmallObject instance;
private StatelessSmallObject() {
// 私有构造函数,防止外部实例化
}
public static StatelessSmallObject getInstance() {
if (instance == null) {
synchronized (StatelessSmallObject.class) {
if (instance == null) {
instance = new StatelessSmallObject();
}
}
}
return instance;
}
}
可能使用到的设计模式
- 享元模式:享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。在频繁创建和销毁小型对象且这些对象有部分相同状态(内部状态)的场景下适用。例如,在一个图形绘制系统中,如果有大量相似的图形对象(如不同位置的相同颜色的圆形),可以将图形的固有属性(颜色等)作为内部状态提取出来共享,而将每个对象独有的属性(位置等)作为外部状态。
import java.util.HashMap;
import java.util.Map;
// 享元对象接口
interface Flyweight {
void operation(String extrinsicState);
}
// 具体享元对象
class ConcreteFlyweight implements Flyweight {
private String intrinsicState;
public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
@Override
public void operation(String extrinsicState) {
System.out.println("Intrinsic State: " + intrinsicState + ", Extrinsic State: " + extrinsicState);
}
}
// 享元工厂
class FlyweightFactory {
private Map<String, Flyweight> flyweights = new HashMap<>();
public Flyweight getFlyweight(String key) {
if (!flyweights.containsKey(key)) {
flyweights.put(key, new ConcreteFlyweight(key));
}
return flyweights.get(key);
}
}
- 对象池模式:如上述对象池技术示例,它本身就是一种设计模式。对象池模式将对象的创建和管理集中起来,避免频繁创建和销毁对象,提高对象的复用率,从而优化内存。适用于需要频繁使用且创建开销较大的小型对象场景。