Design Pattern

[디자인 패턴] 플라이웨이트 패턴 (Flyweight Pattern)

꾸준함. 2024. 6. 29. 15:30

플라이웨이트 패턴

  • 메모리 사용을 최소화하면서 많은 객체를 효율적으로 지원하기 위해 사용되는 구조 디자인 패턴
  • 대량의 작은 객체를 생성하는 경우 유용하며 객체의 상태를 자주 변하는 속성(Extrinsit)과 변하지 않는 속성(Intrinsit)으로 분리하여 공통된 내재 상태를 공유함으로써 메모리 사용을 줄임

 

https://www.javacodegeeks.com/2015/09/flyweight-design-pattern.html

 

주요 구성 요소

 

1. Flyweight 인터페이스

  • 모든 Flyweight 클래스가 구현해야 하는 인터페이스로 주로 자주 변하는 속성(Extrinsit)을 인자로 받는 메서드를 정의

 

2. ConcreteFlyweight 클래스

  • Flyweight 인터페이스 구현체
  • 변하지 않는 속성(Intrinsit)을 저장

 

3. FlyweightFactory 클래스

  • Flyweight 객체를 생성하고 관리하는 역할
  • 요청된 Flyweight가 이미 존재하면 캐시에서 반환하고 존재하지 않으면 새로 생성하여 반환

 

4. Client

  • Flyweight 객체를 사용하는 클라이언트
  • 자주 변하는 속성(Extrinsit)을 관리하고 Flyweight 객체에 이를 전달

 

플라이웨이트 패턴 구현 예시

 

1. Flyweight 인터페이스


 

2. ConcreteFlyweight 클래스


 

3. FlyweightFactory 클래스


 

4. Client 코드

 

 

플라이웨이트 패턴 장단점

 

장점

  • 공유 가능한 객체를 캐싱을 통해 재사용함에 따라 메모리 사용량을 줄일 수 있음

 

단점

  • 객체의 속성을 구분해야 하므로 설계와 구현의 복잡성 증가
  • 상태를 분리하여 관리해야하기 때문에 자칫하면 코드 가독성이 떨어질 수 있음

 

실무에서 쓰이는 플라이웨이트 패턴

 

1. Integer.valueOf(int)

  • 아래 주석에서 볼 수 있다시피 -128 ~ 127처럼 자주 쓰이는 정수에 대해서는 내부적으로 캐싱을 제공해 ==으로 비교해도 true 반환 (Primitive 타입이 아니기 때문에 원래는 equals로 비교해야 함)
    • 실제로 Long.valueOf를 equals가 아닌 ==로 비교하여 장애 발생한 적이 있기 때문에 주의 필요

 

 

 

참고

코딩으로 학습하는 GoF의 디자인 패턴 - 백기선 강사님

반응형