이 디자인패턴은 객체를 '가볍게' 하기 위함 이다. 여기에서의 가볍다라는 것은 메모리의 사용량을 말한다.
한마디로 인스턴스를 가능한 공유시켜서 쓸데없이 new를 하지 않는 것이다.
<< 클래스 다이어그램 >>
<< 예제(Java) >>
결과
객체 생성!? aceHunter님이1레벨이 되어 arrowShotting skill을 사용 할 수 있습니다. aceHunter님이1레벨이 되어 doubleArrowShotting skill을 사용 할 수 있습니다. aceHunter님이30레벨이 되어 arrowShotting 10발 skill을 사용 할 수 있습니다. 객체 생성!? highHunter님이120레벨이 되어 arrowShotting 10발 skill을 사용 할 수 있습니다. highHunter님이120레벨이 되어 슈퍼!! doubleArrowShotting skill을 사용 할 수 있습니다.
public interface Hunter { // Lv 1 public void arrowShotting(); // lv 2 public void doubleArrowShotting(); }
Flyweight 구현부
package kr.pe.acet.flyweight;
public class HunterKind implements Hunter{
private int lv; private String shareObj;
public HunterKind(String shareObj) { this.shareObj = shareObj; } public void setLv(int lv) { this.lv = lv; }
@Override public void arrowShotting() { // TODO Auto-generated method stub if(lv == 1){ System.out.println(shareObj+"님이"+lv+"레벨이 되어 arrowShotting skill을 사용 할 수 있습니다."); }else if(lv > 20){ System.out.println(shareObj+"님이"+lv+"레벨이 되어 arrowShotting 10발 skill을 사용 할 수 있습니다."); } }
@Override public void doubleArrowShotting() { // TODO Auto-generated method stub if(lv == 1){ System.out.println(shareObj+"님이"+lv+"레벨이 되어 doubleArrowShotting skill을 사용 할 수 있습니다."); }else if(lv > 100){ System.out.println(shareObj+"님이"+lv+"레벨이 되어 슈퍼!! doubleArrowShotting skill을 사용 할 수 있습니다."); } }
}
Flyweight Factory 소스
package kr.pe.acet.flyweight;
import java.util.HashMap;
public class HunderVilage {
public HashMap<String, HunterKind> hunterSchool = new HashMap<String, HunterKind>(); public HunderVilage(){ } private static HunderVilage singletonHunter; public static HunderVilage getInstance(){ if(singletonHunter == null){ synchronized(HunderVilage.class){ if(singletonHunter == null) singletonHunter = new HunderVilage(); } } return singletonHunter; } //핵심 코드. public synchronized HunterKind getFlyweightHunter(String shareObj, int level) { HunterKind th = (HunterKind) hunterSchool.get(shareObj); if (th == null) { System.out.println("객체 생성!?"); th = new HunterKind(shareObj); th.setLv(level); hunterSchool.put(shareObj, th); }else{ th.setLv(level); } return th; }
}
hunterSchool에 인스턴스를 종류별로 만들고, 같은 값을 사용하는 인스턴스를 Key 값으로 분류해 사용하면, 매번 new 하지 않아도 되고(new 를 할때 시간소요), 그만큼 메모리도 덜 소비 해서 퍼포먼스를 높일수 있다.