Updated:

1. 개요

공유(sharing)를 통해 많은 객체들을 효과적으로 지원하는 패턴

플라이급 패턴(Flyweight Pattern)은 구조 패턴(Structural Pattern)의 한 종류로, 공유 가능한 객체를 사용하여 실제로 생성되는 객체의 개수를 줄일 수 있다.

2. 구조 패턴(Structural Pattern)

2-1. 구조 패턴이란?

구조 패턴이란 작은 클래스들의 상속과 합성을 통해 더 큰 클래스를 생성하는 방법을 제공하는 패턴으로, 독립적으로 개발한 클래스들을 마치 하나인 것 처럼 사용할 수 있다.

2-2. 구조 패턴 종류

3. 구성

[출처 : GoF의 디자인 패턴]

  • Flyweight : 공유할 객체의 기능을 정의한 인터페이스

  • ConcreteFlyweight : Flyweight 인터페이스 구현체로, 공유에 사용할 클래스

  • UnsharedConcreteFlyweight : Flyweight 인터페이스를 구현체로, 공유에 사용하지 않을 클래스

  • FlyweightFactory : Flyweight 객체를 생성해주는 클래스. 이미 존재하는 객체이면 해당 객체를 반환하고, 존재하지 않는 경우 생성해서 반환

  • Client : Flywieght 패턴을 통해 생성한 객체를 사용하는 클래스

4. 예제 코드

여러대의 컴퓨터에 HDD를 장착한다고 가정해보자. 제조사, 용량별로 다양한 HDD가 필요하고, 각각 객체로 생성되어야 하는데, Flyweight Pattern을 이용하여 공유 객체를 이용하도록 하면 생성되는 객체의 수를 줄일 수 있다.

4-1. Flyweight

[Computer.java]

1
2
3
4
public interface Computer {
    
    void assembly();
}

4-2. ConcreteFlyweight

[Hdd.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Hdd implements Computer {

    private String manufacturer;
    private int volume;

    public Hdd(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    public void setVolume(int volume) {
        this.volume = volume;
    }

    @Override
    public void assembly() {
        System.out.println("HDD mounting : " + manufacturer + ", " + volume + "GB");
    }
}

4-3. FlyweightFactory

[ComputerFactory.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.HashMap;

public class ComputerFactory {

    private static final HashMap<String, Computer> hddMap = new HashMap<>();

    public static Computer getHdd(String manufacturer) {
        Hdd hdd = (Hdd) hddMap.get(manufacturer);
        if(hdd == null) {
            hdd = new Hdd(manufacturer);
            hddMap.put(manufacturer, hdd);
            System.out.println("Create new hdd : " + manufacturer);
        }

        return hdd;
    }
}

Line 9 ~ 13 : HashMap에 존재하지 않는 경우 새로운 객체 생성하여 HashMap에 저장

5. 테스트

[Clinet.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Client {

    private static final String[] manufacturer = {"Hitachi", "WD", "Seagate", "Samsung"};
    private static final int[] volume = {128, 256, 512, 1024};

    public static void main(String[] args) {
        for(int i = 0; i < 5; ++i) {
            Hdd hdd = (Hdd) ComputerFactory.getHdd(getRandomManufacturer());
            hdd.setVolume(getRandomVolume());
            hdd.assembly();
        }
    }

    private static String getRandomManufacturer() {
        Random random = new Random();
        return manufacturer[random.nextInt(4)];
    }

    private static int getRandomVolume() {
        Random random = new Random();
        return volume[random.nextInt(4)];
    }
}

[실행 결과]

6. 특징

  • 메모리 절약 가능 : 하나의 객체를 공유해서 사용하므로 메모리 절약 가능

Updated:

Leave a comment