플라이급 패턴(Flyweight Pattern)
디자인패턴 공부하기
  • JavaScript

플라이급 패턴(Flyweight Pattern)

플라이급 패턴이란 메모리풀을 미리 형성하여 참조하는 개체를 처음 사용할 때 저장한 뒤에, 그 이후에 사용할 때에는 외부에서 불러오지 않고 저장해놓은 데이터를 사용하는 패턴

예제

아파트 한채에 입주자의 목록을 정리한다고 생각해봅시다.

class Apartment {
    let name = '';
    const roomCount = 3;
    const toiletCount = 2;

    setName(name) {
        this.name = name;
    }
}

const apartment1 = new Apartment();
const apartment2 = new Apartment();
const apartment3 = new Apartment();
const apartment4 = new Apartment();

이렇게 생성했지만 roomCounttoiletCount가 집마다 동일하다는것을 발견했습니다.
모든 집에 집주인 이름은 다를 수 있지만, 집의 구조나 방개수, 화장실 개수는 모두 동일한 상태입니다.

이런 경우 메모리를 아끼기 위해 다음과 같이 사용할 수 있습니다.

class Apartment {
    let name = '';
    Apartment.prototype.roomCount = 3;
    Apartment.prototype.toiletCount = 2;

    setName(name) {
        this.name = name;
    }
}

const apartment1 = new Apartment();
const apartment2 = new Apartment();
const apartment3 = new Apartment();
const apartment4 = new Apartment();

1번 집이 방의 벽을 부수고 2개의 방을 1개로 합쳤다면

const apartment1 = new Apartment();
const apartment2 = new Apartment();

apartment1.roomCount = 2;

console.log(apartment1.roomCount); // 2
console.log(apartment2.roomCount); // 3

프로토타입을 공유하지만 apartment1의 방 개수를 바꾸어도 apartment2와는 상관없기 때문에 roomCount를 각각 관리할 수 있습니다.

이와 같은 패턴을 플라이급 패턴 이라고 하고, 이는 싱글턴 패턴과 함께 사용하는 경우가 많습니다.

class Apartment {
    static Apartment apartment;

    let name = '';
    let roomCount = 3;
    let toiletCount = 2;

    setName(name) {
        this.name = name;
    }

    getInstance(){
        if (!apartment) {
            apartment = new Apartment();
        }

        return apartment;
    }
}