디자인 패턴

Flyweight Pattern

kyoulho 2024. 5. 25. 15:29

플라이웨이트 패턴은 많은 수의 유사한 객체를 생성하는 상황에서 메모리 사용을 최적화하기 위한 패턴이다.
이 패턴은 객체의 내부 상태 중에서 공유 가능한 부분을 외부로 분리하여 객체들 간에 공유하도록 설계한다. 이를 통해 객체의 수를 줄이고 메모리를 효율적으로 사용할 수 있다.

구성 요소

  1. Flyweight(플라이웨이트):
    • 공유 가능한 객체의 인터페이스를 정의한다. 내부 상태와 외부 상태를 받아들이는 메서드가 있다.
  2. ConcreteFlyweight(구체적인 플라이웨이트):
    • 플라이웨이트 인터페이스를 구현하고 내부 상태를 가지는 구체적인 클래스입니다. 여러 개의 인스턴스가 생성될 수 있다.
  3. FlyweightFactory(플라이웨이트 팩토리):
    • 플라이웨이트 인스턴스를 생성하고 관리하는 역할을 한다. 이미 생성된 인스턴스를 재사용하거나 새로운 인스턴스를 생성하여 반환한다.
  4. Client(클라이언트):
    • 플라이웨이트 객체를 사용하는 역할을 한다. 필요한 경우 플라이웨이트 팩토리를 통해 플라이웨이트 인스턴스를 얻어온다.

장점

  • 실행 시에 객체 인스턴스의 개수를 줄여 메모리를 절약할 수 있다.
  • 여러 가상 객체의 상태를 한 곳에 모아 둘 수 있다.
  • 어떤 클래스의 인스턴스가 아주 많이 필요하지만 모두 똑같은 방식으로 제어해야 할 때 쓰인다.

단점

  • 일단 이 패턴을 써서 구현해 놓으면 특정 인스턴스만 다른 인스턴스와 다르게 행동하게 할 수 없다는 단점이 있다.

 

예제

// Flyweight 인터페이스
interface TextFlyweight {
    void print(String externalState); // 외부 상태를 인자로 받아 텍스트를 출력하는 메서드
}

// FlyweightFactory 클래스
class TextFlyweightFactory {
	// 플라이웨이트 객체를 캐싱하기 위한 맵
    private final Map<Character, TextFlyweight> flyweights = new HashMap<>();
    
    // 캐릭터를 키로 하여 플라이웨이트 객체를 반환, 없으면 새로 생성하여 맵에 저장
    public TextFlyweight getFlyweight(char character) {
        return flyweights.computeIfAbsent(character, CharacterFlyweight::new);
    }
}

// ConcreteFlyweight 클래스
class CharacterFlyweight implements TextFlyweight {
	// 플라이웨이트 객체가 나타내는 문자
    private final char character;

    public CharacterFlyweight(char character) {
        this.character = character; 
    }

    @Override
    public void print(String externalState) {
        // 주어진 외부 상태와 함께 문자를 출력
        System.out.print(character + externalState + " ");
    }
}

// 클라이언트 클래스
public class Client {
    public static void main(String[] args) {
		// 플라이웨이트 팩토리 생성
        TextFlyweightFactory factory = new TextFlyweightFactory();
		// 출력할 텍스트
        String text = "Hello, Flyweight Pattern!";
        // 텍스트를 문자 배열로 변환
        char[] characters = text.toCharArray();

        for (char character : characters) {
            // 각 문자에 대해 플라이웨이트 객체를 가져와 외부 상태와 함께 출력
            TextFlyweight flyweight = factory.getFlyweight(character);
            flyweight.print("ExternalState"); // 동일한 플라이웨이트 인스턴스를 여러 번 재사용
        }
    }
}

'디자인 패턴' 카테고리의 다른 글

Mediator Pattern  (0) 2024.05.28
Iterator Pattern  (0) 2024.05.27
Factory Pattern  (0) 2024.05.18
Facade Pattern  (0) 2024.05.12
Decorator Pattern  (0) 2024.05.05