의도 :
공유를 통해 많은 수의 소립 객체들을 효과적으로 지원함
동기 :
-본질적 상태 ; 플라이급 객체에 저장되어야 하며 상황과 상관없는 본질적 특성 정보들
-부가적 상태 ; 플라이급 객체가 사용될 상황에 따라 달라질 수 있고 상황에 종속적이므로 공유 될 수 없는 정보들
예) 문서 편집기에서 각 글자
=>문자 하나하나를 객체로 관리하려면 비용이 많이 듦
본질적 상태 - 문자 코드
부가적 상태 - 문서 위치, 인쇄 스타일
각각의 글자를 인스턴스로 갖는 것이 아니라 각 글자들이 나타날 때마다 플라이급 객체의 공유된 풀에 존재하는 인스턴스에 대한 참조자를 갖도록 관리
=>인스턴스를 매번 생성하지 않고 만들어진 것을 공유하여 사용함
활용성 :
참여자 :
package Flyweight;
public class Flyweight {
public Flyweight(String data) {
this.data = data;
}
private String data;
public String getData() {
return data;
}
}
package Flyweight;
import java.util.Map;
import java.util.TreeMap;
public class FlyweightFactory {
Map<String, Flyweight> pool;
public FlyweightFactory() {
pool = new TreeMap<>();
}
public Flyweight getFlyweight(String key) {
Flyweight flyweight = pool.get(key);
if(flyweight == null) {
flyweight = new Flyweight(key);
pool.put(key, flyweight);
System.out.println("새로 생성" + key);
} else {
System.out.println("재사용 " + key);
}
return flyweight;
}
}
package Flyweight;
public class Main {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight flyweight = factory.getFlyweight("A");
System.out.println(flyweight);
flyweight = factory.getFlyweight("A");
System.out.println(flyweight);
}
}
새로 생성A
Flyweight.Flyweight@15db9742
재사용 A
Flyweight.Flyweight@15db9742
협력방법 :
결과 :
예전에 모두 본질적인 상태로 저장되어 있던 것을 부가적인 상태로 만듦
사용예 :