디자인 모드 - FlyWeight 메타 모드


디자인 모드 - FlyWeight 메타 모드
디자인 모델 학습 노트 (22) - FlyWeight 향원 모델.
1. FlyWeight 모드 정의:
 공유 기술 을 활용 하여 대량의 입자 대상 을 효과적으로 지원 하 다.
2. 모델 해설
한 시스템 에 같은 대상 이 여러 개 있다 면 한 개 만 공유 하면 되 고 모든 대상 을 예화 할 필요 가 없다 는 것 이다.플라이 웨 이 트 모드 에 서 는 다양한 대상 이 생 겨 야 하기 때문에 플라이 웨 이 트 모드 에 서 는 팩 토리 모드 가 자주 나타난다.Flyweight 의 내부 상 태 는 공유 하 는 데 사 용 됩 니 다. Flyweight factory 는 대상 저장 소 (Flyweight Pool) 를 유지 하여 내부 상태의 대상 을 저장 합 니 다.Flyweight 모드 는 프로그램의 효율 과 성능 을 향상 시 키 는 모드 로 프로그램의 운행 속 도 를 크게 가속 화 할 수 있다.
3. 구성 도
향 원 모델 과 관련 된 역할 은 추상 적 인 향 원 역할, 구체 적 인 (단순) 향 원 역할, 복합 향 원 역할, 향 원 공장 역할 과 클 라 이언 트 역할 등 이 있다.
 추상 적 인 향원 역할 (Flyweight): 이 역할 은 모든 구체 적 인 향원 류 의 초 류 로 이런 유형 에 실현 해 야 할 공공 인터페이스 나 추상 류 를 규정 한다.외부 상태 (External State) 가 필요 한 작업 은 방법의 매개 변 수 를 통 해 들 어 갈 수 있 습 니 다.추상 적 인 향원 의 인 터 페 이 스 는 향원 을 가능 하 게 하지만 하위 클래스 에 공 유 를 강요 하지 않 기 때문에 모든 향원 대상 이 공유 할 수 있 는 것 이 아니다.
구체 적 인 향원 (Concrete Flyweight) 역할: 추상 적 인 향원 역할 에 규정된 인 터 페 이 스 를 실현 한다.내 포 된 상태 가 있다 면 내 포 된 상태 에 저장 공간 을 제공 하 는 것 을 책임 져 야 한다.향 원 대상 의 내포 상 태 는 대상 이 처 한 주변 환경 과 무관 하여 향 원 대상 이 시스템 에서 공유 할 수 있 도록 해 야 한다.가끔 은 구체 적 인 향원 역할 을 단순 하고 구체 적 인 향원 역할 이 라 고도 부른다. 왜냐하면 복합 향원 역할 은 단순 하고 구체 적 인 향원 역할 이 복합 을 통 해 이 루어 진 것 이기 때문이다.
복합 향원 (Unsharable Flyweight) 캐릭터: 복합 향원 캐릭터 가 대표 하 는 대상 은 공유 할 수 없 지만 하나의 복합 향원 대상 은 여러 개 자체 가 단순 향원 대상 의 조합 으로 분해 할 수 있다.복합 향원 캐릭터 는 공유 할 수 없 는 향원 대상 이 라 고도 부른다.이 캐릭터 는 일반적으로 거의 사용 되 지 않 는 다.
 향 원 공장 (FlyweightFactoiy) 역할: 본 역할 은 향 원 역할 을 창설 하고 관리 합 니 다.본 캐릭터 는 향원 대상 이 시스템 에 의 해 적당 하 게 공유 되 는 것 을 보증 해 야 합 니 다.클 라 이언 트 대상 이 향 원 대상 을 요청 할 때 향 원 공장 역할 은 시스템 에 요구 에 부합 되 는 향 원 대상 이 있 는 지 확인 해 야 한다. 만약 에 이미 있 으 면 향 원 공장 역할 은 기 존의 향 원 대상 을 제공 해 야 한다.만약 시스템 에 적당 한 향 원 대상 이 없다 면 향 원 공장 역할 은 새로운 적당 한 향 원 대상 을 만들어 야 한다.
클 라 이언 트 (Client) 캐릭터: 본 캐릭터 는 모든 향원 대상 의 외 함 상 태 를 자체 적 으로 저장 해 야 합 니 다.
넷 째, 하나의 예import java.util.Hashtable;
  
/**
*
* @author <a href="mailto:[email protected]">flustar</a>
* @version 1.0
* Creation date: Jan 25, 2008 1:33:49 PM
*/
  
 // "Flyweight"
  
 abstract class Character
 {
  protected char symbol;
  protected int width;
  protected int height;
  protected int ascent;
  protected int descent;
  protected int pointSize;
  
  public abstract void Display(int pointSize);
 }
  
 // "ConcreteFlyweight"
  
 class CharacterA extends Character
 {
  // Constructor
  public CharacterA()
  {
   this.symbol = 'A';
   this.height = 100;
   this.width = 120;
   this.ascent = 70;
   this.descent = 0;
  }
  
  public void Display(int pointSize)
  {
   this.pointSize = pointSize;
   System.out.println(this.symbol +
    " (pointsize " + this.pointSize + ")");
  }
 }
  
 // "ConcreteFlyweight"
  
 class CharacterB extends Character
 {
  // Constructor
  public CharacterB()
  {
   this.symbol = 'B';
   this.height = 100;
   this.width = 140;
   this.ascent = 72;
   this.descent = 0;
  }
  
  public void Display(int pointSize)
  {
   this.pointSize = pointSize;
   System.out.println(this.symbol +
    " (pointsize " + this.pointSize + ")");
  }
  
 }
  
 // C, D, E, etc.
  
 // "ConcreteFlyweight"
  
 class CharacterZ extends Character
 {
  // Constructor
  public CharacterZ()
  {
   this.symbol = 'Z';
   this.height = 100;
   this.width = 100;
   this.ascent = 68;
   this.descent = 0;
  }
  
  public void Display(int pointSize)
  {
   this.pointSize = pointSize;
   System.out.println(this.symbol +
    " (pointsize " + this.pointSize + ")");
  }
 }
 // "FlyweightFactory"
  
 class CharacterFactory
 {
  private Hashtable characters = new Hashtable();
  
  public Character GetCharacter(char key)
  {
   // Uses "lazy initialization"
   Character character = (Character)characters.get(key);
   if (character == null)
   {
    switch (key)
    {
     case 'A': character = new CharacterA(); break;
     case 'B': character = new CharacterB(); break;
      //
     case 'Z': character = new CharacterZ(); break;
    }
    characters.put(key, character);
   }
   return character;
  }
 }
// test application
 public class Test
 {
  public static void main(String []args)
  {
   // Build a document with text
   String document = "AAZZBBZB";
   char[] chars = document.toCharArray();
  
   CharacterFactory f = new CharacterFactory();
  
   // extrinsic state
   int pointSize = 10;
  
   // For each character use a flyweight object
   for(char c : chars)
   {
    pointSize++;
    Character character = f.GetCharacter(c);
    character.Display(pointSize);
   }
   
  }
 }

적용 성
Flyweight 모드 의 유효성 은 어느 정도 그것 을 어떻게 사용 하 느 냐, 어디서 사용 하 느 냐 에 달 려 있다.다음 상황 이 모두 성립 될 때 Flyweight 모드 를 사용 합 니 다.
1) 한 응용 프로그램 이 대량의 대상 을 사용 했다.
2) 대량의 대상 을 사용 하기 때문에 저장 비용 이 많이 든다.
3) 대상 의 대부분 상 태 는 외부 상태 로 변 할 수 있다.
 4) 대상 의 외부 상 태 를 삭제 하면 여러 그룹 대상 을 상대 적 으로 적은 공유 대상 으로 대체 할 수 있다.
5) 응용 프로그램 은 대상 표지 에 의존 하지 않 는 다.
장단 점
1) 향 원 모드 는 시스템 을 더욱 복잡 하 게 한다.대상 이 공유 할 수 있 도록 일부 상 태 를 외부 화 시 켜 프로그램의 논 리 를 복잡 하 게 해 야 한다.
2) 향 원 모드 는 향 원 대상 의 상 태 를 외부 화하 고 외부 상 태 를 읽 으 면 운행 시간 이 약간 길어진다.

좋은 웹페이지 즐겨찾기