프로그래밍/디자인패턴

디자인 패턴 - Flyweight (Structural Pattern)

aiemag 2021. 2. 20. 00:41
반응형

Structural Pattern인 Flyweight Pattern에 대해 정리합니다.

 

Flyweight는 Diet를 위해 군살을 빼듯이,

 

불필요한 객체 생성을 반복하지 않고, 최대한 쥐어짜서 있는 것을 사용하도록 합니다.

 

 


Definition

 

Flyweight 는 instance를 항상 만드는 것이 아니라, 이미 만들어진 인스턴스를 이용하는 패턴입니다.

 

Flyweight Pattern은 Structural Pattern에 해당합니다.

 


Class Diagram

 


Sample Case

 

다음은 Flyweight 패턴을 적용한 시나리오입니다.

 

Scenario

요즘 들어 예전 팝송이 생각이 나서 음악을 들어보던 중, 멜로디가 너무나 좋아 가사를 찾아보고 싶습니다.

 

우리가 만든 장치(MusicFactory)에 음악(Music)의 title을 입력하면 노래의 가사(lyrics)가 자동으로 생성이 되어 볼 수 있습니다.(showLyrics())

 

이 때, 노래의 가사가 생성이 될 때는 시간이 꽤 걸리기 때문에, 한번 가사를 생성한 음악은 MusicFactory에 저장해 두고 다음번에 검색시에는 빠르게 가사를 보려고 합니다.

 

이런 시스템을 우리는 만들고자 합니다:)

 

Class Diagram

MusicFactory 는 같은 작업을 매번 반복하므로, singleton 패턴으로 만듭니다.

 

MusicFactory에서 사용되는 pool은 Hash 자료구조로, 새롭게 만들어야 하는 data는 만들고, 다음번에 재사용을 위해 Hash에 저장해둡니다.

 

MusicFactory를 이용하여 Music 객체를 HashMap에 저장하여 다음번에 재사용을 합니다.

 

 

 

Code

 

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
    public static void main(String args[]) {
        
        MusicFactory mf = MusicFactory.getInstance();        
        mf.getMusic("Let it be");
        mf.getMusic("The rain");
        mf.getMusic("Oasis");
        
        Music chosen = mf.getMusic("The rain");
        chosen.showLyrics();
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.Random;
 
public class Music {
    private String lyrics;
    private Random random = new Random();
    
    public Music(String title) {
        lyrics = title + "'s lyrics : ";
        
        for(int i=0 ; i<100 ; i++) {
            lyrics += random.nextInt(100);
        }
        
        try {
            Thread.sleep(1000);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public void showLyrics() {
        System.out.println(lyrics);
    }
}
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.HashMap;
 
public class MusicFactory {
    private HashMap pool = new HashMap();
    private static MusicFactory singleton = new MusicFactory();
    private MusicFactory() {}
    
    public static MusicFactory getInstance() {
        return singleton;
    }
    
    public synchronized Music getMusic(String title) {
        Music music = (Music)pool.get(title);
        if(music==null) {
            music = new Music(title);
            pool.put(title, music);
        }
        return music;
    }
}
cs

 

실행 결과

 

반응형