Flyweight Design [플라이웨이트 디자인]
Design Object [디자인목적]
- 많은 객체를 생성해야 할 때
- 자바 객체 생성(new 키워드) 시 생성된 객체는 jvm heap영역에 보관.
- 너무 많은 객체 생성 시 성능저하 발생 가능 (ex : 게임에서 다수의 동일 케릭터 생성)
- 공통부분을 포함(implements or extends) 하는 객체의 경우 공통부분은 shared 하여 객체를 생성하면, 효율적인 공간관리 가능.
- 많은 객체를 생성해야 할 때
Options [대안들]
- 싱글턴 패턴
- 팩토리 패턴
Benefit [디자인 장점]
여러 객체간 공통부분을 묶음으로써, 대량 객체 생성 시에도 공간을 절약할 수 있다.
공간을 절약함으로써, application의 성능 향상
한번 생성 된 객체는 해제되지 않고, 풀에서 관리
게임 등에서 케릭터 구현 시 사
Structure & Sample Code [구조와 샘플코드]
1) 이미지를 불러오는 어플리케이션의 proxy
UML

구조
-> Letter 객체 : 한 글자와 getter를 포함
-> LetterFactory : Letter를 담는 HashMap을 유지하며, 새로운 key가 생성되면, Letter를 생성하고, 이미 존재하면, HashMap에 존재하는 Letter객체 재사용.
-> WordProcessor : 입력받은 String 의 Letter를 arrayList로 보관하며, 출력함.
-> client에서 복사할 문자열을 wordprocessor로 복사하고, LetterFactory를 통해 객체 재사용 및 생성.
1)App(client)
public class Client {
public static void main(String[] args) {
WordProcessor processor = new WordProcessor();
String textToAdd = "Hello i'm aaaa wwworddd pprocessorrrr"; //source string
int length = textToAdd.length();
LetterFactory factory = new LetterFactory(); //letter factory
for(int i = 0; i<length;i++){
String value = textToAdd.substring(i,i+1);
/*
* factory will check the key string value is exists in memory
*/
processor.addLetter(factory.createLetter(value));
}
processor.printLetters();
}
}
2) WordProcessor
public class WordProcessor {
//array for contain copied string value letter instance
private List<Letter> letters = new ArrayList<Letter>();
public void addLetter(Letter letter){
this.letters.add(letter);
}
public void printLetters(){
for (Letter letter : letters) {
System.out.print(letter.getValue());
}
}
}
3) LetterFactory
public class LetterFactory {
//Map object to contain generated Letter object
private Map<String, Letter> letterMap = new HashMap<String, Letter>();
/**
* if Letter has key value exists return that Letter object
* else create new Letter object and put it into Map
*/
public Letter createLetter(String key){
Letter letter = letterMap.get(key);
if(letter == null){
letter = new Letter(key);
letterMap.put(key,letter);
}
return letterMap.get(key);
}
}
4) Letter
public class Letter {
private String value;
public Letter(String value) {
System.out.println("New letter created with value: "+value);
this.value = value;
}
public String getValue() {
return value;
}
}