플라이웨이트 패턴은 많은 수의 유사한 객체를 생성하는 상황에서 메모리 사용을 최적화하기 위한 패턴이다.
이 패턴은 객체의 내부 상태 중에서 공유 가능한 부분을 외부로 분리하여 객체들 간에 공유하도록 설계한다. 이를 통해 객체의 수를 줄이고 메모리를 효율적으로 사용할 수 있다.
구성 요소
- Flyweight(플라이웨이트):
- 공유 가능한 객체의 인터페이스를 정의한다. 내부 상태와 외부 상태를 받아들이는 메서드가 있다.
- ConcreteFlyweight(구체적인 플라이웨이트):
- 플라이웨이트 인터페이스를 구현하고 내부 상태를 가지는 구체적인 클래스입니다. 여러 개의 인스턴스가 생성될 수 있다.
- FlyweightFactory(플라이웨이트 팩토리):
- 플라이웨이트 인스턴스를 생성하고 관리하는 역할을 한다. 이미 생성된 인스턴스를 재사용하거나 새로운 인스턴스를 생성하여 반환한다.
- 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"); // 동일한 플라이웨이트 인스턴스를 여러 번 재사용
}
}
}
728x90
'디자인 패턴' 카테고리의 다른 글
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 |