You will be fine

<디자인패턴입문> 17. Flyweight 패턴

by BFine
반응형

 

www.yes24.com/Product/Goods/2918928

 

Java 언어로 배우는 디자인 패턴 입문

이 책은 디자인 패턴의 입문서입니다. GoF가 정리한 23개의 디자인 패턴을 하나씩 다루면서 객체 지향을 잘 모르는 초보자도 이해하기 쉽도록 정리하고 있습니다. 단순한 이론이나 논리을 제시하

www.yes24.com

가. 무엇인가

 a. 훨훨~날자

  -  Flyweight은 플라이급이란 의미로 권투에서는 가장 가벼운 체급을 의미한다.

      =>  플라이웨이트 패턴에서는 객체를 가볍게 하기 위한 것이다.  

  -  여기서 무게는 메모리 사용량을 의미한다. ex) 적은 메모리 사용 - 가벼운객체

  -  어떤 클래스의 인스턴스가 많이 필요할때 new를 많이 사용하면 메모리 사용량이 커진다.

     => 그러므로 인스턴스를 가능한대로 공유시켜서 쓸데없이 new 하지 않도록 해야한다.

 

나. 만들어본 예제

 a. Flyweight(플라이급)의 역할

  -  평소대로 취급하면 프로그램이 무거워지기 때문에 공유하는 것이 좋을 것을 나타내는 역할

public interface Flyweght {
    void drink();
}


public class Soju implements Flyweght {
    private final int alcoholContent;

    public Soju(int alcoholContent) {
        this.alcoholContent = alcoholContent;
    }

    @Override
    public void drink() {
        System.out.println(" 소주 도수는 "+alcoholContent+" 입니다.");
    }

    public int getAlcoholContent() {
        return alcoholContent;
    }


}


public class Wine implements Flyweght{
    private final int alcoholContent;

    public Wine(int alcoholContent) {
        this.alcoholContent = alcoholContent;
    }

    @Override
    public void drink() {
        System.out.println(" 와인 도수는 "+alcoholContent+" 입니다.");
    }

    public int getAlcoholContent() {
        return alcoholContent;
    }
}

public class Beer implements Flyweght {
    private final int alcoholContent;

    public Beer(int alcoholContent) {
        this.alcoholContent = alcoholContent;
    }
    
    @Override
    public void drink() {
        System.out.println(" 맥주 도수는 "+alcoholContent+" 입니다.");

    }

    public int getAlcoholContent() {
        return alcoholContent;
    }

}

 b. FlyweightFactory(플리이급의 공장)의 역할

  -  Flyweight 역할의 한번 만든 인스턴스를 공유하는 역할이다. 

public class FlyweightFactory {
    private static Map<AlcoholType,Flyweght> pool = new WeakHashMap<>();

    public static Flyweght getFlyweight(AlcoholType alcoholType){
        if (!pool.containsKey(alcoholType)) {
            if (AlcoholType.BEER == alcoholType) {
                pool.put(alcoholType, new Beer(5));
            }
            if (AlcoholType.SOJU == alcoholType) {
                pool.put(alcoholType, new Soju(17));
            }
            if (AlcoholType.WINE == alcoholType) {
                pool.put(alcoholType, new Wine(10));
            }
        }
        return pool.get(alcoholType);
    }
}

 e. Main (Client)

package flyweight;

public class Main {
    public static void main(String[] args) {

        Flyweght flyweght1 = FlyweightFactory.getFlyweight(AlcoholType.SOJU);
        Flyweght flyweght2 = FlyweightFactory.getFlyweight(AlcoholType.BEER);
        Flyweght flyweght3 = FlyweightFactory.getFlyweight(AlcoholType.BEER);
        Flyweght flyweght4 = FlyweightFactory.getFlyweight(AlcoholType.WINE);
        Flyweght flyweght5 = FlyweightFactory.getFlyweight(AlcoholType.SOJU);

        flyweght1.drink();
        flyweght2.drink();
        flyweght3.drink();
        flyweght4.drink();
        flyweght5.drink();

        System.out.println(flyweght2+" "+flyweght3);//동일한 인스턴스
    }
}

/**
"C:\Program Files\Java\jdk1.8.0_251\bin\java.exe"
 소주 도수는 17 입니다.
 맥주 도수는 5 입니다.
 맥주 도수는 5 입니다.
 와인 도수는 10 입니다.
 소주 도수는 17 입니다.
 flyweight.Beer@1540e19d flyweight.Beer@1540e19d

*/

다. 정리

 a. 공통관리

  -  공유하고 있는 것을 변경하면 여러 장소에 영향을 미치는 부분을 조심해야한다.

  -  외부에서 참조되고 있는 인스턴스는 '사용중'으로 판단하여 가비지컬렉션 되지 않는다.

       => ex) 예제에서 pool이 관리하는 인스턴스

 b. intrinsic 와 extrinsic

  -  intrinsic(본질,고유)은 공유시키는 정보를 의미한다.

      => 어떠한 상황에서도 변한지 않는 정보, 상태에 의존하지않는 정보

  -  extrinsic(비본질,외부)은 공유시키지 않는 정보를 의미한다.

 

C. Singleton 패턴과의 차이

  -  플라이웨이트 패턴은 어떤 타입에 대해서 각각의 고유한 인스턴스를 관리한다는 부분에서 차이가 있다.

     => 상황에 따라서 extrinsic한 인스턴스도 포함한다.

Flyweight 패턴은 메모리 사용량을 줄이기위해 공유하는 인스턴스들을 생성하여 관리하는 패턴이다.

 

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기