[Flyweight패턴] 객체를 Pooling하고 공유할때 써라.~

2007. 7. 27. 09:34Java

Flyweight패턴

Flyweight란 무엇일까요. 말그대로 가벼운 거죠.
자바에서 가볍다란 의미는 무엇일까요. 적은 리소스를 가지고 큰일을 한다. 이게 아닐까요.

Flyweight에는 공유가능한 Object pooling이 녹아있습니다.
(만약 공유가 가능하지않으면 사용중인지 체크해야겠죠?)

일정의 Object를 Pool에 저장해 놓고 있다가, 요청이 오면 그 Pool에서 가져와 주는거죠.
근데 차이점은, 바로 공유가 된다는 겁니다.

실제 현실에선 불가능하지만, 컴퓨터 상으론 가능하죠.
공을 달라는 축구선수에게, 같은 공을 다 줄수 있는 겁니다. ㅎㅎ

즉, 모든 축구선수는 1번~20번 축구공을 모두 가질수 있습니다.
그러나 축구공은 20개만 필요할 뿐이죠. 공유가 가능하니까요.


인간에 대한 인터페이스를 정의해봅니다. 사람은 일을 하죠.~ 일에 대한 work 메소드를 정의합니다.

// 인간.
interface Person {
    public void work();    //일을 합니다.
}


가장 중요한 부분입니다. pooling을 하죠, get()메소드는 일꾼을 가져오는 역할을 합니다.
만약 일꾼이 이미 존재하는 사람이면 그사람을 데려오고,
없으면 새로 생성합니다.(?) ㅎㅎ

// 일꾼 공장.
class PersonFactory {
    private Hashtable<Integer, Person> workers = new Hashtable<Integer, Person>();
    // 일꾼을 가져옵니다. 없으면 새로 생성합니다.
    public Person get(int pid) {
        Person person = workers.get(pid);
        if(person==null) {
            person = new Worker(pid);
            workers.put(pid,person);
        }
        return person;
    }
    // 총 일꾼수.
    public int size() {
        return workers.size();
    }
}


일꾼의 역활을 구현합니다.
work메소드를 호출하면, **일을 합니다. 라고 나오겠죠.~
// 일꾼.
class Worker implements Person{
    private int pid;
    public Worker(int pid) {
        System.out.println(pid+" 일꾼을 생성 합니다.");
        this.pid = pid;
    }
    public void work() {
        System.out.println(pid+" 일꾼이 일을 합니다.");
    }
}


이제 위에서 구현한 것을 구동해봅시다.
public class FlyWeightTest {
    public static void main(String[] args) {
        PersonFactory fac = new PersonFactory();
        // 1번 일꾼을 가져옵니다. 만약 없으면 새로 생성합니다.
        Person p1 = fac.get(1);
        p1.work();
        
        // 1번 일꾼에게 다시 일을 시킵니다.
        Person p2 = fac.get(1);
        p2.work();
        
        // 2번 일꾼을 가져옵니다. 만약 없으면 새로 생성합니다.
        Person p3 = fac.get(2);
        p3.work();
        
        // 총 몇명의 일꾼을 가지고 있는지 파악합니다.
        System.out.println("총일꾼수="+fac.size());
    }

}

1번의 일꾼을 2번 가져왔습니다. 그러나 생성은 한번만 됬죠? 2번을 가져왔더니, 일꾼이
존재하지 않아 생성했습니다.

이렇게 Object풀링이 가능하고, 각 Object가 서로 공유가능하도록 쓰여지는것이
바로 FlyWeight 패턴입니다.

저같은 경우는 이런 패턴을 이렇게 씁니다.
- 네트워크 프로토콜들을 정의해서 쓸때,
- 명령어 키워드로 사용할때,





by ncanis(조성준)