<디자인패턴입문> 17. Flyweight 패턴
by BFine반응형
www.yes24.com/Product/Goods/2918928
가. 무엇인가
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 패턴은 메모리 사용량을 줄이기위해 공유하는 인스턴스들을 생성하여 관리하는 패턴이다.
반응형
'개발서적 > 디자인패턴입문' 카테고리의 다른 글
<디자인패턴입문> 19. Command 패턴 (0) | 2021.05.12 |
---|---|
<디자인패턴입문> 18. Proxy 패턴 (0) | 2021.05.11 |
<디자인패턴입문> 16. State 패턴 (0) | 2021.05.09 |
<디자인패턴입문> 15. Memento 패턴 (0) | 2021.05.08 |
<디자인패턴입문> 14. Observer 패턴 (0) | 2021.05.07 |
블로그의 정보
57개월 BackEnd
BFine