본문 바로가기

General/Pattern

[Design Pattern] Flyweight Pattern / Flyweight Design Pattern


 Flyweight Pattern 이란?

Flyweight : 플라이급 – 권투에서 체중이 가장 가벼운 체급

Flyweight 패턴은 Object(객체)를 ‘가볍게’ 하기 위한 것입니다.

무거운 Object : 많은 메모리를 사용하는 Object
가벼운 Object : 적은 메모리를 사용하는 Object

어떤 클래스의 인스턴스는 new Something()과 같이 만들수 있습니다.
이때 그 인스턴스를 저장하기 위해 메모리가 확보된되고, Something 클래스의 인스턴스가 많이 필요할 때, new를 많이하면 메모리의 사용량이 커진다는 것!! 

한마디로 말하자면!!인스턴스를 가능한한 공유시켜서 쓸데없이 new 하지 않도록 합니다.

이미 만들어진 인스턴스를 이용할 수 있으면 그것을 공유해서 사용합니다.
 


 클래스 다이어그램



클래스 설명

Flyweight(플라이급)
평소대로 취급하면 프로그램이 무거워지기 때문에,공유하는 것이 좋은것을 나타내는 역할

FlyweightFactory(플라이급의 공장)
Flyweight를 만들어 내는 공장의 역할
이 공장을 사용해 Flyweight 역할을 만들면 인스턴스가 공유

Client(의뢰자)
FlyweightFactory를 사용, Flyweight를 만들고 그것을 이용하는 역할







 예제


아래와 같은 방식으로 숫자를 프린트 해주는 클래스들이 있다고 해봅시다.
0 ~ 9 까지 이런 클래스들이 존재하고,
1 2 1 2 1 2 3 을 아래와 같은 큰 결과로 출력하려고 할때, Flyweight 패턴을 이용할 수 있습니다.





출력할 결과는 아래와 같이 1 2 1 2 1 2 3 일것입니다.
이때, 각각 하나의 인스턴스를 공유해서 사용하는 것이 Flyweight 패턴입니다.
이미 만들어진 1이라는 인스턴스가 있다면, 그것을 사용하고, 없다면 새로 만들어 팩토리의 pool 에 저장해두고 씁니다.







 Flyweight Pattern에 대해서

여러 장소에 영향을 미친다.
 - 공유하고 있는 것을 변경하면 여러 장소에 영향을 미칩니다.
 - 하나의 인스턴스를 변경하면 그 인스턴스를 사용하고 있는 여러 장소에 동시에 영향이 미칩니다.

리소스 절약
 - Flyweight 패턴은 메모리의 사용량을 줄일 수 있습니다.
 - 또한 new 해서 인스턴스를 생성하는 것은 너무너무너무나도 힘든 일인데,
    new 하는 수를 줄임으로써 프로그램의 속도를 올릴 수 있습니다. (시간이라는 리소스를 절약)





 관련있는 패턴

Singleton 패턴
 - FlyweightFactory에서 인스턴스를 만들때 Singleton 패턴이 되는 경우가 있습니다.

Proxy 패턴
 - Flyweight 패턴에서 인스턴스 생성에 시간이 걸리는 경우,
   인스턴스의 공유에 따라 처리속도가 향상된다라고 하는군요.

Composite 패턴
 - Flyweight 패턴을 사용해서 Composite 패턴의 Leaf 역할을 공유시킬 수 있는 경우가 있습니다.