디자인 모드 - 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) 향 원 모드 는 향 원 대상 의 상 태 를 외부 화하 고 외부 상 태 를 읽 으 면 운행 시간 이 약간 길어진다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.