본문 바로가기

JAVA/GOF Design Pattern

GOF 플라이웨이트 패턴

SMALL

자바 플라이웨이트(Flyweight) 패턴은 객체를 공유하여 메모리 사용을 최적화하는 구조(Structural) 디자인 패턴입니다. 이 패턴은 많은 수의 유사한 객체를 생성하는 상황에서 사용됩니다. 이때, 객체의 내부 상태는 불변(immutable)하게 유지하고, 외부에서 변경 가능한 상태를 나타내는 외부 상태를 별도로 관리합니다.

주요 구성 요소:
- Flyweight: 공유되는 객체의 인터페이스 또는 추상 클래스를 정의합니다. 내부 상태에 대한 동작을 정의하고, 외부 상태를 받아들이는 메서드를 선언합니다.
- ConcreteFlyweight: Flyweight 인터페이스를 구체적으로 구현하는 클래스입니다. 내부 상태를 저장하고, 외부 상태에 대한 동작을 수행합니다.
- FlyweightFactory: Flyweight 객체를 관리하고 반환하는 팩토리 클래스입니다. 객체의 공유를 관리하며, 동일한 외부 상태에 대해 이미 생성된 Flyweight 객체를 반환합니다.

플라이웨이트 패턴의 핵심 아이디어는 객체의 내부 상태를 공유하여 메모리를 절약하는 것입니다. 동일한 외부 상태에 대해 여러 개의 객체가 생성될 필요가 없으며, 객체의 내부 상태는 불변이므로 공유해도 안전합니다. 이를 통해 객체 생성과 관련된 비용을 줄이고, 성능을 향상시킬 수 있습니다.

플라이웨이트 패턴은 자바의 문자열 풀(String Pool)과 같은 곳에서 주로 사용됩니다. 문자열 풀은 동일한 문자열을 여러 개의 객체로 생성하는 대신, 하나의 문자열 객체를 공유함으로써 메모리를 절약합니다.




import java.util.HashMap;
import java.util.Map;

// Flyweight
interface Coffee {
    void serveCoffee(String size);
}

// ConcreteFlyweight
class CoffeeFlavor implements Coffee {
    private String flavor;

    public CoffeeFlavor(String flavor) {
        this.flavor = flavor;
    }

    public String getFlavor() {
        return flavor;
    }

    @Override
    public void serveCoffee(String size) {
        System.out.println("Serving coffee flavor " + flavor + " in size " + size);
    }
}

// FlyweightFactory
class CoffeeFactory {
    private Map<String, Coffee> flavors = new HashMap<>();

    public Coffee getCoffeeFlavor(String flavor) {
        Coffee coffee = flavors.get(flavor);

        if (coffee == null) {
            coffee = new CoffeeFlavor(flavor);
            flavors.put(flavor, coffee);
        }

        return coffee;
    }

    public int getFlavorCount() {
        return flavors.size();
    }
}

// 예시 사용
public class FlyweightPatternExample {
    private static final String[] flavors = { "Espresso", "Cappuccino", "Latte", "Mocha", "Americano" };

    public static void main(String[] args) {
        CoffeeFactory coffeeFactory = new CoffeeFactory();

        // 다양한 종류의 커피 객체 생성
        for (String flavor : flavors) {
            Coffee coffee = coffeeFactory.getCoffeeFlavor(flavor);
            coffee.serveCoffee("Medium");
        }

        // 생성된 커피 객체 수 출력
        System.out.println("Total coffee flavors created: " + coffeeFactory.getFlavorCount());
    }
}

위의 예시 코드에서는 플라이웨이트 패턴을 구현하기 위해 Coffee 인터페이스를 정의하고, CoffeeFlavor 클래스에서 이를 구체적으로 구현합니다. CoffeeFactory 클래스는 플라이웨이트 객체를 관리하고 반환하는 팩토리 역할을 합니다.

FlyweightPatternExample 클래스에서는 예시로 다양한 종류의 커피 객체를 생성하고 CoffeeFactory를 통해 반환받아 서빙합니다. 마지막으로 생성된 커피 객체의 수를 출력합니다.


LIST

'JAVA > GOF Design Pattern' 카테고리의 다른 글

GOF 자바 스테이트(state) 패턴  (0) 2023.05.18
GOF 자바 프록시 패턴  (0) 2023.05.15
GOF Composite 디자인패턴  (0) 2023.05.13
GOF 파사드 패턴  (0) 2023.05.10
GOF 어댑터 패턴  (0) 2023.05.10