애플리케이션에서 많은 인스턴스를 생성하는 중에 사용할 수 있는 패턴이다. 인스턴스를 많이 사용하면 OutOfMemory
, 즉 메모리가 부족한 현상이 발생하는데, 따로 모아서 재사용할 수 있는 패턴이다. 자주 사용하는 속성(extrinsit
)과 그렇지 않은 속성(intrinsit
)을 분리하여 자주 변경되지 않는 속성을 재사용한다.
Flyweight
의 속성은 immutable
해야 한다. 즉, 이 인스턴스의 값을 임의로 변경할 수 없다. 다른 인스턴스에도 공유되는 데이터이기 때문이다. Java에서는 final
키워드로 immutable
을 유지할 수 있다.
// Flyweight
public final class Font { //상속 방지
final String family;
final int size;
//getter, setter, constructor
}
public class Character {
private char value;
private String color;
private Font font
//constructor
}
flyweight의 인스턴스에 접근하고 캐싱하는 역할을 한다.
public class FontFactory {
private Mat<String, Font> cache = new HashMap<>();
puboic Font getFont(String font) {
if(cache.containKey(font)) {
return cache.get(font);
} else {
String[] split = font.split(":");
Font newFont = new Font(split[0], Integer.parseInt(split[1]));
cache.put(font, newFont);
return newFont;
}
}
}
public class Clinet {
public static void main(String[] args) {
FontFactory fontFactory = new FontFactory();
Character c1 = new Character("h", "white", fontFactory.getfont("namu:12"));
//...
}
}
도메인에서의 특정된 부분을 간추리는데 사용하는 패턴이기 때문에 라이브러리나 프레임워크에서 찾기는 쉽지 않다.
Integer i1 = Integer.valueOf(10);
자주사용되는 값들을 캐싱해서 값을 반환한다.