디자인 모드향 원 디자인 모드 (flyweight)

6858 단어 flyweight
향 원 모드 는 공유 하 는 방식 으로 대량의 입자 대상 을 효율적으로 지원 한다.아주 작은 대상 이 많 습 니 다. 이런 대상 들 은 공 통 된 것 이 많 습 니 다. 그러면 하나의 대상 이 되 고 다른 것 도 있 습 니 다. 외부의 속성 으로서 방법의 매개 변수 로 들 어 갑 니 다.
public class FlyweightDemo {

    public static void main(String[] args) {

        Integer m = 127;

        Integer n = 127;

        System.out.println(m==n);//   true,            

        

        

        Integer a = Integer.valueOf(323);

        Integer b = Integer.valueOf(323);

        System.out.println(a==b);

    }



}

 
 
대상 을 대상 으로 하 는 프로 그래 밍 언어 로 볼 때 모든 사 무 는 대상 (Object) 으로 묘사 된다.대상 은 상태 (속성) 와 행위 (방법) 를 가지 고 있 습 니 다. 우 리 는 같은 행 위 를 가 진 대상 을 클래스 (Class) 로 추상 화 합 니 다. 클래스 는 행위 만 유지 하 는 대상 템 플 릿 으로 볼 수 있 고 클래스 는 실행 할 때 상태 데 이 터 를 다시 부여 하여 대상 을 형성 할 수 있 습 니 다.
        실행 할 때 대상 은 상태 데 이 터 를 저장 하기 위해 일정한 메모리 공간 을 차지한다.특별한 처 리 를 하지 않 으 면 같은 종류 로 생 성 된 두 대상 임 에 도 불구 하고 이 두 대상 의 상태 데 이 터 는 똑 같 지만 메모리 에 두 개의 공간 을 차지 합 니 다. 이러한 상황 은 프로그램의 기능 에 영향 을 주지 않 을 수도 있 습 니 다. 그러나 상태 가 같은 같은 대상 을 메모리 에 합 친다 면반드시 저장 공간의 낭 비 를 크게 줄 일 것 이다.
       현실 적 인 예 를 들 어 한 타 오 바 오 점 에서 잘 팔 리 는 여성 용 구 두 를 운영 하고 매일 대량의 주문 정 보 를 처리 해 야 한다. 주문 에 고객 이 구 매 한 구두 정 보 를 표시 해 야 한다. 우 리 는 구두 제품 을 추상적으로 추정한다.
class Shoe{ 

    

    String color;//   

    int size;//   

    String position;//     

     

    public String getColor() { 

        return color; 

    } 

     

    public void setColor(String color) { 

        this.color = color; 

    } 

     

    public int getSize() { 

        return size; 

    } 

     

    public void setSize(int size) { 

        this.size = size; 

    } 

     

    public String getPosition() { 

        return position; 

    } 

     

    public void setPosition(String position) { 

        this.position = position; 

    } 

     

}

 
위의 코드 에서 설명 한 바 와 같이 구 두 는 색깔, 사이즈, 재고 위치 세 가지 상태 데이터 로 나 뉜 다.그 중에서 색깔 과 사 이 즈 는 구두 의 자연 상태 로 우 리 는 대상 내부 상태 라 고 부 르 는데 이런 상태 데 이 터 는 대상 자체 와 만 관련 되 고 외부 환경의 변화 에 따라 변화 하지 않 는 다.다시 재고 위 치 를 보면 우 리 는 이 상 태 를 대상 의 외부 상태 라 고 부른다. 외부 상 태 는 대상 자체 와 필연 적 인 관계 가 없고 외부 상 태 는 항상 외부 환경의 변화 로 인해 변화 한다. 즉, 외부 상 태 는 외부 환경 에 의 해 결정 된다.이 사례 에서 구 두 는 오늘 A 창고 에 두 고 내일 B 창고 에 둘 수 있 지만 어느 창고 에 보관 하 든 같은 구 두 는 같은 구두 로 보관 위치 에 따라 색깔 과 사 이 즈 는 달라 지지 않 는 다.
        향 원 모드 의 핵심 사상 은 내부 상태 가 같은 대상 을 저장 할 때 캐 시 하 는 것 이다.즉, 같은 색 의 같은 사이즈 의 구 두 는 메모리 에 하나의 인 스 턴 스 만 저장 하고 대상 을 방문 할 때 대상 캐 시 버 전 을 방문 하 는 것 이지 매번 대상 을 다시 만 드 는 것 이 아 닙 니 다.
        향 원 모드 는 대상 이 외부 속성 을 가지 도록 허용 합 니 다. 우리 가 방문 하 는 것 은 항상 대상 캐 시 버 전 이기 때문에 대상 을 사용 하기 전에 외부 상 태 를 대상 에 다시 주입 해 야 합 니 다.향 원 모드 는 새로운 대상 생 성 을 금지 하기 때문에 향 원 모드 를 사용 할 때 공장 방법의 응용 이 수반 된다.우 리 는 아래 의 예 를 살 펴 보 자.
class ShoeFactory { 

     

    Collection<Shoe> shoes = new ArrayList<Shoe>(); 

 

    Shoe getSheo(String color, int size, String position) { 

        //           

        for (Shoe shoe : shoes) { 

            if (shoe.getColor() == color && shoe.getSize() == size) { 

                //                   

                shoe.setPosition(position); 

                return shoe; 

            } 

        } 

        //                  

        Shoe shoe = new Shoe(); 

        shoe.setColor(color); 

        shoe.setSize(size); 

        shoe.setPosition(position); 

        shoes.add(shoe); 

        return shoe; 

    } 

}  

Shoe Factory 공장 을 통 해 우리 가 매번 받 는 구 두 는 캐 시 버 전 입 니 다. 캐 시 에 우리 가 필요 로 하 는 대상 이 없 으 면 새로 대상 을 만 들 고 캐 시 에 넣 습 니 다.상례 에서 대상 의 외부 속성 position 가 대상 을 어떻게 되 돌려 주 는 지 주의 하 십시오.www.2cto.com
        우리 가 자신의 업무 장면 에서 향 원 모드 를 응용 할 때 반드시 대상 의 내부 상태 와 외부 상 태 를 구분 해 야 한다. 향 원 모드 는 캐 시 버 전 은 대상 의 내부 상태 만 포함 할 수 있 음 을 강조 한다.
        사실 자바 의 String 과 Integer 류 는 모두 메타 모드 의 응용 예 입 니 다. String 류 내 부 는 모든 문자열 대상 을 캐 시 합 니 다. 같은 문자열 은 메모리 에 한 버 전 만 유지 합 니 다.이와 유사 하 게 Integer 류 는 내부 에서 255 이하 의 정수 에 대해 서도 캐 시 를 진행 했다.
        향 원 모델 이 기업 급 구조 디자인 에서 응용 되 는 사례 가 비 일비 재 하 다. 현대 대형 기업 급 응용 에서 없어 서 는 안 되 거나 없어 서 는 안 되 는 캐 시 시스템 도 바로 향 원 모델 을 바탕 으로 점차적으로 완선 되 고 발전 한 것 이다.

좋은 웹페이지 즐겨찾기