Flyweight 패턴

ITKHJ·2023년 2월 17일
0

GoF의 디자인 패턴

목록 보기
4/16
post-thumbnail

- 객체를 가볍게 만들어 메모리 사용을 줄이는 패턴

- 굉장히 많은 인스턴스들을 만들다 되면 메모리 사용을 많이 하게 되어 out of memory가 발생하거나, 메모리가 부족한 현상이 일어날 수 있는 데, 이 패턴을 적용해서 공통되는 부분을 따로 모아서 재사용하는 패턴

- 이 패턴을 이용해서 공통되는 코드나, 자주 변하지 않는(intrinsit, 내적인 거) 패턴과 자주 변하는(extrinsit, 외적인) 패턴을 분리하고 재사용하여 메모리 사용을 줄일 수 있다.

※ 잘 변하지 않는 코드를 모아둔 것이 플라이웨이트 패턴

→ 동일한 속성으로 사용 했던 코드는 플라이웨이트 펙토리에서 캐싱을 해두고 있다가

클라이언트가 같은 요청을 하면 바로 가져다 쓸 수 있다.

※ 사용 예시

Font 클래스 생성(intrinsit)

flyweight에 해당하는 Font(intrinsit)라는 클래스를 생성하여 Family(글씨체)와 size(글씨 크기) 두개를 정의한다.
→ 이 두개의 속성은 인트린짓한 속성, 내적인 속성으로 보고 생성하는 것
→ 이렇게 생성한 속성은 다른 곳에서도 공유하는 데이터이기 때문에 누군가가 바꿔서 쓸 수 있어서는 안된다.(Final)

각각 편수에 Final을 붙여주고 간단하게 기본 생성자 생성하고 getter만 생성해준다. 그리고 클래스에다가도 final을 붙인다.

Character 클래스 생성(extrinsit)

이 자주 변하는 객체(Extrinsit)에서 플라이웨이트(Font)를 참조하고 생성자를 만들어둠
→ Font font; 부분

FontFactory(=FlyweightFactory) 클래스 생성

간단하게 Map 으로 캐시를 구현하였음
Font가 있으면 꺼내서 주고 없으면 만들어 준다.(if문 부분)

Client 클래스 생성

기존과 다르게 FontFactory를 통해서 fontFactory.getFont로 글씨체와 사이즈를 가져옴으로 써 모두 공유하는 인스턴스로 제 각각 만들어 준것이 아니기 때문에 메모리를 덜 사용하게 됨

기존 Client 클래스 참조

※ Flyweight 패턴을 적용한 코드와는 다르게 fontFamily(글씨체)와 fontSize(글씨 크기)를 인스턴스마다 부여함으로써 메모리를 의미 없이 낭비하고 있는 것을 확인할 수 있다.

장점 : 애플리케이션에서 사용하는 메모리를 줄일 수 있다.

단점 : 코드의 복잡도가 증가한다.

profile
모든 업무 지식 작성하자!

0개의 댓글