1. 개요

이 기사에서는 플라이웨이트 디자인 패턴에 대해 살펴보겠습니다. 이 패턴은 메모리 사용 공간을 줄이는 데 사용됩니다. 또한 개체 인스턴스화 비용이 많이 드는 응용 프로그램의 성능을 향상시킬 수도 있습니다.

간단히 말해 플라이웨이트 패턴은 생성된 개체를 생성 후 저장하여 재활용하는 Factory을 기반으로 합니다. 객체가 요청될 때마다 팩토리는 객체가 이미 생성되었는지 확인하기 위해 객체를 조회합니다. 존재하는 경우 기존 객체가 반환됩니다. 그렇지 않으면 새 객체가 생성되고 저장된 다음 반환됩니다.

플라이웨이트 개체의 상태는 다른 유사한 개체와 공유되는 불변 구성 요소( intrinsic )와 클라이언트 코드에서 조작할 수 있는 변형 구성 요소( extrinsic ) 로 구성됩니다 .

플라이웨이트 개체가 변경 불가능하다는 것이 매우 중요합니다. 상태에 대한 모든 작업은 팩터리에서 수행해야 합니다.

2. 시행

패턴의 주요 요소는 다음과 같습니다.

  • 플라이웨이트 개체에서 클라이언트 코드가 수행할 수 있는 작업을 정의하는 인터페이스
  • 인터페이스의 하나 이상의 구체적인 구현
  • 개체 인스턴스화 및 캐싱을 처리하는 팩터리

각 구성 요소를 구현하는 방법을 살펴보겠습니다.

2.1. 차량 인터페이스

먼저 Vehicle 인터페이스를 생성합니다. 이 인터페이스는 팩토리 메소드의 반환 유형이 될 것이므로 모든 관련 메소드를 노출해야 합니다.

public void start();
public void stop();
public Color getColor();

2.2. 콘크리트 차량

다음으로 Car 클래스를 구체적인 Vehicle로 만들어 봅시다 . 우리 차는 차량 인터페이스의 모든 방법을 구현할 것입니다. 상태에 관해서는 엔진과 색상 필드가 있습니다.

private Engine engine;
private Color color;

2.3. 차량 Factory

마지막으로 VehicleFactory를 생성합니다 . 새 차량을 만드는 것은 매우 비용이 많이 드는 작업이므로 Factory에서는 색상당 차량을 하나만 만듭니다.

이를 위해 Map를 간단한 캐시로 사용하여 생성된 차량을 추적합니다.

private static Map<Color, Vehicle> vehiclesCache
  = new HashMap<>();

public static Vehicle createVehicle(Color color) {
    Vehicle newVehicle = vehiclesCache.computeIfAbsent(color, newColor -> { 
        Engine newEngine = new Engine();
        return new Car(newEngine, newColor);
    });
    return newVehicle;
}

클라이언트 코드가 객체를 createVehicle 메서드에 인수로 전달하는 객체의 외부 상태(차량 색상)에만 영향을 미칠 수 있다는 점에 유의하십시오 .

3. 사용 사례

3.1. 데이터 압축

플라이웨이트 패턴의 목표는 가능한 한 많은 데이터를 공유하여 메모리 사용량을 줄이는 것이므로 무손실 압축 알고리즘의 좋은 기반입니다. 이 경우 각 플라이웨이트 개체는 외부 상태가 컨텍스트 종속 정보인 포인터 역할을 합니다.

이러한 사용의 전형적인 예는 워드 프로세서입니다. 여기서 각 캐릭터는 렌더링에 필요한 데이터를 공유하는 플라이웨이트 객체입니다. 결과적으로 문서 내부의 문자 위치만 추가 메모리를 차지합니다.

3.2. 데이터 캐싱

많은 최신 애플리케이션은 캐시를 사용하여 응답 시간을 개선합니다. 플라이웨이트 패턴은 캐시의 핵심 개념과 유사하며 이 목적에 잘 맞을 수 있습니다.

물론 이 패턴과 일반적인 범용 캐시 간에는 복잡성과 구현에 몇 가지 중요한 차이점이 있습니다.

4. 결론

요약하면 이 빠른 사용방법(예제)는 Java의 플라이급 디자인 패턴에 중점을 두었습니다. 또한 패턴과 관련된 가장 일반적인 시나리오 중 일부를 확인했습니다.

예제의 모든 코드는 GitHub 프로젝트 에서 사용할 수 있습니다 .

Generic footer banner