Use the Flyweight Pattern when one instance of a class can be used to provide many virtual instances

 

Flyweight 패턴은 비용이 큰 자원을 공통으로 사용할 수 있도록 만드는 패턴이다.
자원에 대한 비용은 크게 두가지로 나눠 볼 수 있다.

1. 중복 생성될 가능성이 높은 경우.
중복 생성될 가능성이 높다는 것은 동일한 자원이 자주 사용될 가능성이 매우 높다는 것을 의미한다. 이런 자원은 공통 자원 형태로 관리하고 있다가 요청이 있을 때 제공해 주는 편이 좋다.

2. 자원 생성 비용은 큰데 사용 빈도가 낮은 경우.
이런 자원을 항상 미리 생성해 두는 것은 낭비이다. 따라서 요청이 있을 때에 생성해서 제공해 주는 편이 좋다.

이 두가지 목적을 위해서 Flyweight 패턴은 자원 생성과 제공을 책임진다. 자원의 생성을 담당하는 Factory 역할과 관리 역할을 분리하는 것이 좋을 수 있으나, 일반적으로는 두 역할의 크기가 그리 크지 않아서 하나의 클래스가 담당하도록 구현한다.

출처 - https://effectiveprogramming.tistory.com/entry/Flyweight-%ED%8C%A8%ED%84%B4

 

예를 들어 새로운 조경 설계 애플리케이션에서 나무 객체를 추가하려고 한다.

애플리케이션에서 나무는 X, Y 위치를 가지면서 나이에 따라 동적인 크기로 그릴 수 있다고 하자.

 

 

이 경우 나무를 나타나는 것은 문제없지만,

대규모의 큰 나무 숲을 만들 경우, 각각의 나무에 대해 위치 정보와 나이 대한 정보를 관리하며 

Tree 인스턴스를 생성하고 제거하면서 프로그램이 느려질 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이러한 경우 수천 개의 Tree 오브젝트가있는 대신 Tree 인스턴스는 하나만 존재하고, 모든 트리의 상태를 유지하는 클라이언트 오브젝트가 있도록 시스템을 설계 하는 것이 바로 Flyweight 패턴이다.

 

HeadFirst Design Pattern - Flyweight Pattern

 

 

위 클래스 다이어그램에서 보는 바와 같이 Tree 객체와 이 자원을 관리하는 매니저 클래스 TreeManager 클래스로 바꿀 수 있다.

Tree의 경우 여러 경우를 미리 생성해두고 이를 Manager에서 관리하게 된다.

 

이를 코드로 구현해보면 아래와 같다.

.

 

장점

  • 런타임시 객체 인스턴스 수를 줄여 메모리를 절약한다.
  • 많은 virtual 개체의 상태를 단일 위치로 중앙 집중화한다.

단점

  • 일단 구현하면 클래스의 단일 논리적 인스턴스가 다른 인스턴스와 독립적으로 동작 할 수 없다.

언제 사용하는가?

  • 클래스의 많은 인스턴스가 필요할 때 사용되며, 그리고 그 객체들을 모두 동일하게 제어할 때 사용한다.

'책을 읽자 > Design Patterns' 카테고리의 다른 글

Proxy pattern  (0) 2021.08.18
Decorator Pattern  (0) 2021.08.18
Template Method Pattern  (0) 2021.08.02
Strategy Pattern  (0) 2021.08.02
Bridge Pattern  (0) 2021.01.19

+ Recent posts