디자인 모델 - Flyweight 모델 에 대한 인식

3546 단어 디자인 모드
단순 향원 모델 과 관련 된 역할 은 다음 과 같다.
추상 적 인 향원 (Flyweight) 역할: 이 역할 은 모든 구체 적 인 향원 류 의 초 류 로 이런 유형 에 실현 해 야 할 공공 인 터 페 이 스 를 규정 한다.외부 상태 (External State) 가 필요 한 작업 은 상업 적 방법 을 호출 하여 매개 변수 로 들 어 갈 수 있다.
구체 적 인 향원 (Concrete Flyweight) 역할: 추상 적 인 향원 역할 에 규정된 인 터 페 이 스 를 실현 한다.내 포 된 상태 가 있다 면 내 포 된 상태 에 저장 공간 을 제공 하 는 것 을 책임 져 야 한다.향 원 대상 의 내포 상 태 는 대상 이 처 한 주변 환경 과 무관 하여 향 원 대상 이 시스템 에서 공유 할 수 있 도록 해 야 한다.
향 원 공장 (FlyweightFactory) 역할: 본 역할 은 향 원 역할 을 창설 하고 관리 합 니 다.본 캐릭터 는 향원 대상 이 시스템 에 의 해 적당 하 게 공유 되 는 것 을 보증 해 야 합 니 다.클 라 이언 트 대상 이 향 원 대상 을 호출 할 때 향 원 공장 역할 은 시스템 에 복합 적 으로 요구 하 는 향 원 대상 이 있 는 지 확인 합 니 다.만약 에 이미 있 으 면 향 원 공장 의 역할 은 기 존의 향 원 대상 을 제공 해 야 한다.시스템 에 적당 한 향 원 대상 이 없다 면 향 원 공장 역할 은 적당 한 향 원 대상 을 만들어 야 한다.
클 라 이언 트 (Client) 역할: 이 역할 은 모든 메타 대상 에 대한 인용 을 유지 해 야 합 니 다.본 캐릭터 는 모든 향원 대상 의 외 함 상 태 를 스스로 저장 해 야 합 니 다.
식당 에 서 는 레 시 피 에 필요 한 요리 가 있 으 면 사지 않 고 바로 요리 창고 에 가서 가 져 오고 없 으 면 사 러 가서 요리 창고 에 넣 어야 합 니 다.

public interface FlyWeight
{
    public void buy(People people);
    public String getFoodName();
    public void setFoodName(String foodName);
}
public interface People
{ 
    public void cooking(String foodName);
}

public class Food implements FlyWeight
{
    private String foodName;

    public void buy(People people)
    {
        people.cooking(foodName);
    }

    public String getFoodName()
    {
        return foodName;
    }

    public void setFoodName(String foodName)
    {
        this.foodName = foodName;
    }

}
public class Kitchener implements People
{

    public void cooking(String foodName)
    {
        System.out.println("cooking----"+foodName);

    }
}
public class FlyWeightFactoy
{
    private Hashtable<String, FlyWeight> storage = new Hashtable<String, FlyWeight>();
    
    public FlyWeight getFood(String key)
    {
       FlyWeight food = (FlyWeight) storage.get(key);   
       
       if ( food == null )
       {   
            food = new Food();   
            storage.put( key, food);   
       }          
       return food;
    }
}
public class TestFlyWeight
{
    public static void main(String[] args)
    {
        FlyWeightFactoy factory = new FlyWeightFactoy();
        People people = new Kitchener();
        FlyWeight meal = factory.getFood("Meal");
        meal.setFoodName("Meal");
        meal.buy(people);  
    }

}

향 원 모드 는 어떤 상황 에서 사용 해 야 합 니까?
아래 의 모든 조건 이 만족 할 때 향 원 모드 를 사용 하 는 것 을 고려 할 수 있다.
하나의 시스템 에는 대량의 대상 이 있다.
이 대상 들 은 대량의 메모 리 를 소모 한다.
이들 대상 의 상태 중 대부분 은 외부 화 할 수 있다.
이 대상 들 은 내 포 된 상태 에 따라 여러 그룹 으로 나 눌 수 있 으 며, 외 포 된 대상 을 대상 에서 제거 할 때 각 그룹 은 하나의 대상 으로 만 대체 할 수 있다.
소프트웨어 시스템 은 이들 대상 의 신분 에 의존 하지 않 는 다. 다시 말 하면 이들 대상 은 분별 할 수 없다.
이상 의 이러한 조건 을 만족 시 키 는 시스템 은 향원 대상 을 사용 할 수 있다.
마지막 으로 향 원 모드 를 사용 하려 면 시스템 에 기 존의 모든 향 원 을 기록 한 표를 유지 해 야 하 는데 이것 은 자원 을 소모 해 야 한다.따라서 공유 할 수 있 는 충분 한 향원 실례 가 있어 야 향원 모드 를 사용 할 수 있다.
향 원 모델 의 장점 과 단점:
메타 모드 의 장점 은 메모리 의 대상 수 를 대폭 줄 이 는 것 이다.그러나 이 를 위해 치 르 는 대가 도 높다.
향 원 모델 은 시스템 을 더욱 복잡 하 게 한다.대상 이 공유 할 수 있 도록 일부 상 태 를 외부 화 시 켜 프로그램의 논 리 를 복잡 하 게 해 야 한다.
향 원 모드 는 향 원 대상 의 상 태 를 외부 화하 고 외부 상 태 를 읽 으 면 운행 시간 이 약간 길 어 집 니 다.

좋은 웹페이지 즐겨찾기