해당 포스트는 "자바 객체지향 디자인 패턴", "JAVA 언어로 배우는 디자인 패턴 입문" 책의 내용을 요약한 것이다.



※ 플라이웨이트(Flyweight) 패턴

: 데이터를 공유하여 메모리를 절약하는 패턴으로 공통으로 사용되는 객체는 한 번만 생성되고 공유를 통해 풀(Pool)에 의해 관리, 사용된다.

 

ex)

 

public class Flywight{
   private String data;
   public Flyweight(String data){
          this.data = data;
    }
    public String getData(){
         return data;
    }
}

public class FlyweightFactory{
    Map pool;
  
    public FlyweightFactory(){
        pool = new TreeMap();
    }
    public Flyweight getFlyweight(String key){
       Flyweight flyweight = pool.get(key);
       if(flyweight == null){
             flyweight = new Flyweight(key);
             pool.put(key, flyweight);
             System.out.println("새로 생성 : "+ key);
       else{
             System.out.prinlln("재사용 : "+key);
        }
       return flyweight;
   }
}

public class Main{
    public static void main(String[] args){
      FlyweightFactory factory = new FlyweightFactory();
      
      Flyweight flyweight = factory.getFlyweight("A");
      System.out.prinln(flyweight);
      Flyweight flyweight = factory.getFlyweight("B");
      System.out.prinln(flyweight);
      Flyweight flyweight = factory.getFlyweight("C");
      System.out.prinln(flyweight);
      Flyweight flyweight = factory.getFlyweight("B");
      System.out.prinln(flyweight);
      Flyweight flyweight = factory.getFlyweight("A");
      System.out.prinln(flyweight);
      Flyweight flyweight = factory.getFlyweight("A");
      System.out.prinln(flyweight);
    }
}

<결과>

 

Flyweight 패턴을 적용한 예로 자바 String 객체를 들 수 있다.

public class Test{
  public static void main(String[] args){
      String s = "hello";
      String s1 = new String("hello");
      String s2 = "hello";
 
      System.out.println("s == s1 ? " + (s == s1));
      System.out.println("s == s2 ? " + (s == s2));
   }
}

위의 결과로 (s == s1) 은 false가 나오고 (s==s2)는 true가 나온다. JVM은 문자열을 생성할 때 String Pool 이라는 공간에 문자열을 저장한다. String 타입의 객체를 선언할 때 new 연산자가 아닌 대입 연산자를 통해서 값을 선언하면 JVM이 String Pool 에서 같은 문자열이 있는 지를 우선 찾게 된다. 만약 같은 문자열이 존재하지 않는다면 새로운 문자열을 생성하고 같은 문자열을 가지고 있다면 새로운 객체를 생성하는 것이 아니라 같이 참조하게 된다. 이렇게 Flyweight 패턴을 적용해 객체 생성을 최소화해 객체가 많을 시 CPU의 많은 비용을 차지하는 가비지 컬렉션이 덜 일어나도록 한다.

'자바 > 디자인패턴' 카테고리의 다른 글

책임 연쇄/사슬 패턴  (0) 2017.06.08
생성자의 인자가 많을 시 빌더 패턴  (0) 2017.06.08
퍼사드 패턴  (0) 2017.06.08
프로토타입 패턴  (0) 2017.06.08
컴퍼지트 패턴  (0) 2017.06.07

+ Recent posts