Hello

[디자인 패턴] - Flyweight

by 볼빵빵오춘기

Flyweight

많은 수의 유사 객체를 만들 때, 공통된 데이터를 공유해서 메모리 사용량을 최소화하는 디자인 패턴이다.

 

예시 코드

// Flyweight Interface
interface Shape {
    void draw(String color);  // 외부 상태인 색상은 매번 넘김
}

// Concrete Flyweight
class Circle implements Shape {
    private final String shapeType = "Circle"; // 내부 상태

    public void draw(String color) {
        System.out.println(color + " 색상의 " + shapeType + " 그리기");
    }
}

// Flyweight Factory
class ShapeFactory {
    private static final Map<String, Shape> shapes = new HashMap<>();

    public static Shape getCircle() {
        Shape circle = shapes.get("circle");
        if (circle == null) {
            circle = new Circle();
            shapes.put("circle", circle);
        }
        return circle;
    }
}

// Client
public class Client {
    public static void main(String[] args) {
        Shape circle1 = ShapeFactory.getCircle();
        circle1.draw("Red");

        Shape circle2 = ShapeFactory.getCircle();
        circle2.draw("Blue");

        // circle1 == circle2 (같은 객체 재사용)
    }
}

 

Flyweight 패턴의 장점

메모리 사용량 감소

동일한 속성을 공유하는 객체를 재사용하므로 메모리를 절약한다.

 

성능 향상

대량 객체 생성 없이 공유해 효율적으로 처리한다.

 

객체 간 일관성 유지

동일한 내부 데이터를 공유하므로 변경될 일이 없다.

 

Flyweight 패턴의 단점

복잡성 증가

공유할 데이터와 외부 데이터를 분리하는 구조 설계가 복잡하다.

 

상태 분리가 어려움

외부 상태와 내부 상태를 혼동하면 버그 발생 가능성 있다.

 

객체 관리가 어려움

객체 재사용, 캐시 관리 등을 잘못하면 성능이 악화될 수 있다.

 

Flyweight 패턴은 언제 사용하나?

수많은 유사한 객체를 생성해야 할 때

ex) 글자 수천 개, 게임에서 수백 개의 총알 객체 등

 

객체 간에 공통 상태가 많을 때

내부 상태(공유)는 하나만 만들어 놓고 재사용 가능할 때

 

메모리 사용을 줄여야 할 때

IoT 기기, 모바일, 임베디드 등 리소스 제한 환경에서 유용하다.

 

정리하자면

Flyweight 패턴은 객체를 공유해서 메모리를 아끼고, 수많은 유사 객체를 효율적으로 관리하기 위한 패턴이다.

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기