Structural Pattern
각 개체에 모든 데이터를 보관하는 대신 여러 개체 간의 상태의 공통 부분을 공유하여 RAM에 더 많은 개체를 보관할 수 있는 패턴
총 쏘는 게임을 만들어서 친구에게 보내줬는데 친구는 RAM이 부족해서 충돌발생!
총알, 미사일 또는 파편 같은 입자는 많은 데이터를 포함하는 개체로 표시해 화면 상 절정에 이르렀을 경우 새로 생성된 입자들을 RAM이 감당하지 못해서 충돌이 발생
color
와 sprite
필드가 많은 메모리를 사용하는데 심지어 모든 입자에 걸쳐 거의 같은 데이터를 저장합니다.
vector
, speed
, coords
와 같은 상태는 입자마다 고유하고 시간에 따라 변화합니다. 반면 color
와 sprite
는 입자마다 일정하게 유지됩니다.
이러한 상수 데이터들을 고유한(Intrinsic) 상태라고 합니다. 다른 개체들을 이 데이터를 읽을 수만 있고 변경할 수는 없습니다. 외부에서 변경 가능한 경우 공유한 상태라고 합니다.
Flyweight 패턴은 객체 내부에서 상태 저장을 하는 대신 상태에 의존하는 특정 메서드들에 전달하도록 합니다. 고유한 상태만 객체에 유지되므로 Context가 다른 곳에서 재사용할 수 있습니다. 이러한 객체들은 변형이 적기 때문에 훨씬 적은 수의 객체만 있으면 됩니다.
이제 Particle 클래스에서 공유한 상태를 추출해 고유한 상태만 저장하는 객체를 플라이웨이트라고 합니다.
같은 Flyweight 객체가 다른 Context에서 사용될 수 있으므로 수정되는지 확인해야 합니다. 생성자를 통해 상태를 한 번만 초기화하고 필드를 다른 객체에 노출해서는 안 됩니다.
다양한 Flyweight를 관리하기 위해 Factory 메서드를 생성할 수 있습니다. Client에서 고유한 상태를 받아 일치하는 기존 객체를 찾아 반환합니다. 그렇지 않으면 새로운 Flyweight를 생성하여 추가합니다.
❗️플라이웨이트는 최적화에 불과합니다.
패턴을 적용하기 전에 메모리에 유사한 객체들을 대량으로 보유하는 것과 관련된 RAM 소비 문제가 있는지 확인하고 다른 방법으로 해결될 수 없는지 확인하세요.