밤 늦게까지 여는 카페

[디자인 패턴] 플라이웨이트(flyweight) 패턴이란 본문

디자인 패턴/구조 패턴

[디자인 패턴] 플라이웨이트(flyweight) 패턴이란

Jㅐ둥이 2022. 9. 2. 09:30
반응형

오늘 공부할 디자인 패턴은 플라이웨이트 패턴입니다.

 

1. 플라이웨이트 패턴이란

플라이웨이트 패턴은 이미 생성되어 있는 객체를 재활용하여 자원을 효율적으로 사용하는 패턴입니다. 싱글톤 패턴과 유사해보입니다만 플라이웨이트 패턴의 경우에는 객체의 세부 상태에 따라서 여러 개의 객체가 생성될 수 있습니다.

 

2. 활용하기 좋은 순간

  • 소프트웨어에서 너무 많은 객체가 생성될 때
  • 많은 수의 객체들을 생성하는 대신에 공유하는 것으로 대체할 수 있을 때

 

3. 예시

플라이웨이트 패턴을 공부하면서 CarInterface로 적절한 예시를 찾기가 어렵더라구요. 이번에는 Piano 클래스라는 새로운 예시를 준비해봤습니다.

 

우리는 3d 게임을 만들고 있고, 마침 피아노 오브젝트가 즐비한 맵을 만들고 있습니다. 피아노 오브젝트의 건반은 실제로 상호작용이 이뤄지며 소리가 재생됩니다. 플레이어가 건반을 조작할 경우, 해당 건반과 맵핑되는 음원 파일이 재생됩니다. 이 때, 피아노 건반 하나하나 객체를 생성하고, 각 객체들은 음원 파일을 읽어와야 할까요? 피아노 오브젝트가 1, 2개라면 문제 없겠지만 갯수가 많아질수록 시스템에 걸리는 부하가 커질 것입니다.

 

플라이웨이트 패턴을 적용하여 문제를 해결해볼까요?

 

아래의 예제 코드를 보시면 생성되는 피아노 객체는 건반 객체들을 공유하고 있다는 것을 확인할 수 있습니다.

플라이웨이트 패턴을 설명할 때, 싱글톤 패턴과는 다른 점을 설명드렸는데 준비한 예시에서는 보여드리질 못했네요 ^^;;;

 

## piano.py
class Piano:
    def __init__(self):
        self.key_map = load_keys()
    
    def play(self, key: str):
        self.key_map[key].play()
 
 
 ## key.py
 KEYS = {}
 def load_keys():
     global KEYS
     if len(KEYS) > 0:
         return KEYS
     for i in range(88):
         str_i = str(i)
         KEYS[str_i] = Key(str_i)
     return KEYS
 
 class Key:
     def __init__(self, key: str):
         self.load(key)
     
     def load(self, key: str):
         with open(f"/data/{:s}.mp4".format(key)) as f:
             self.content = f.read()
     
     def play(self):
         ## play the mp4 file
         pass
반응형