[디자인 모델] 향원 모델 실현 (실현 절차 | 추상 향원 류 | 구체 향원 류 | 향원 공장 | 사용자 호출 | 코드 템 플 릿)

15932 단어 디자인 모드
글 목록
  • I. 향 원 모델 실현 절차
  • II. 향원 모드 추상 향원 류
  • III. 향원 모드 구체 향원 류
  • IV. 향 원 모드 향 원 공장
  • V. 향 원 모드 사용자 호출
  • I. 향 원 모드 실현 절차
    1. 추상 향 원 류 를 정의 한다. 추상 류, 내부 상태, 외부 상태, 추상 적 인 방법 을 정의 한다.
    ① 추상 류: 이런 유형 은 추상 적 인 유형 으로 향 원 공장 류 와 사용자 호출 에서 관련 된 대상 유형 은 이 추상 적 인 유형 이 라 고 밝 히 고 구체 적 인 실현 류 를 직접 사용 하지 않 는 다.
    ② 내부 상 태 를 정의 합 니 다. 내부 상태 데 이 터 는 여러 개의 입자 대상 (사용자 가 실제 사용 하 는 1 만 개의 대상) 이 공유 하 는 정보 입 니 다. 공 유 는 대상 풀 에서 하나의 향 원 대상 (공유 대상) 을 유지 하 는 것 입 니 다. 여러 개의 입자 대상 이 향 원 공장 류 에서 이 향 원 대상 을 얻 을 때 이 향 원 대상 (공유 대상) 을 얻 습 니 다.이러한 입자 대상 (사용자 가 사용 하 는 대상) 이 사용 하 는 내부 상태 (데이터) 는 모두 같 을 것 이다.정의 할 때 이 상태 에 너무 관심 을 가지 지 않 고 내부 상태 와 외부 상 태 를 구분 하면 됩 니 다.
    ③ 외부 상 태 를 정의 한다. 이 상 태 는 매우 중요 하 다. 이 정 보 는 대상 풀 에서 대상 을 얻 는 근거 로 한다.즉, 외부 상태 가 같은 두 대상 은 대상 이 같다 는 것 을 설명 한다.
    ④ 추상 적 인 행 위 를 정의 한다. 메타 류 의 실제 조작 을 누 리 는 것 은 추상 적 인 방법 이자 최종 사용자 가 이 메타 류 를 호출 하 는 방법 이다.
    2. 구체 적 인 향원 류 를 정의 한다. 추상 향원 류 를 계승 하고 추상 향원 류 의 추상 적 인 방법 을 실현 한다.
    ① 계승: 이런 추상 적 인 향 원 류 를 계승 하면 여러 개의 구체 적 인 향 원 류 를 정의 할 수 있다.
    ② 사용: 원류 대상 을 성명 할 때 원류 유형 을 추상 적 으로 향유 하고 실제 적 으로 이 대상 에 게 값 을 부여 할 때 구체 적 인 향유 원 류 를 부여 해 야 한다.
    ③ 대상 지 대상: 향 원 공장 류 중의 대상 지 는 서로 다른 구체 적 인 향 원 류 대상 을 저장 할 수 있 으 나 모두 추상 적 인 향 원 류 의 하위 대상 이 어야 한다.
    3. 향 원 공장 클래스 정의:
    ① 정의 대상 풀: 대상 풀 은 일반적으로 Map 키 값 대 유형 으로 추상 적 인 메타 대상 의 외부 상태 데 이 터 를 키 로 하고 값 은 메타 대상 을 누 리 는 것 이다.
    ② 대상 가 져 오기 메커니즘: 사용자 가 외부 상태 에 따라 메타 대상 을 가 져 올 때 대상 풀 에서 메타 대상 이 존재 하 는 지 확인 하고 이 대상 이 존재 하지 않 으 면 이 대상 을 만 들 고 새로 만 든 대상 을 대상 풀 에 넣 고 메타 대상 을 되 돌려 줍 니 다.
    4. 사용자 호출: 사용 자 는 향 원 공장 류 를 사용 하여 추상 적 인 향 원 류 유형 대상 을 만 들 고 구체 적 인 향 원 류 대상 을 부여 하 며 추상 적 인 방법 을 사용한다.
    II. 향원 모드 추상 향원 류
    1. 추상 적 인 향원 류 AbstractFlyweight 정의:
    ① 내부 상 태 를 정의 한다. private String intrinsicState 내부 상태, 즉 여러 개의 입자 대상 (사용자 가 가지 고 있 는 여러 대상) 이 공유 하 는 정보 이다. 이 부분 은 우리 가 관심 을 가지 지 않 고 Getter 와 Setter 방법 을 설정 하면 된다.
    ② 외부 상 태 를 정의 합 니 다: protected final String externalState 외부 상 태 는 final 수식 을 사용 하 는 것 을 추천 합 니 다. 이것 은 구조 함수 밖의 곳 에서 이 값 을 수정 하지 않도록 하기 위해 서 입 니 다. 외부 상태 값 은 대상 이 만 들 때 만 값 을 부여 할 수 있 고 다른 때 는 이 값 을 수정 할 수 없습니다.
    ③ 추상 적 인 행 위 를 정의 한다. abstract void action() 이것 은 메타 류 의 구체 적 인 논리 로 구체 적 인 메타 역할 에서 이런 유형 을 실현 한다.
    2. 추상 적 인 메타 코드 예제:
    package kim.hsl.design.flyweight;
    
    /**
     *        
     */
    public abstract class AbstractFlyweight {
        /**
         *     
         */
        private String intrinsicState;
    
        /**
         *     
         *      final      ①       ②          
         *           
         */
        protected final String externalState;
    
        public AbstractFlyweight(String externalState) {
            this.externalState = externalState;
        }
    
        /**
         *      
         */
        abstract void action();
    
        /*
                       Getter   Setter   
         */
        public String getIntrinsicState() {
            return intrinsicState;
        }
        public void setIntrinsicState(String intrinsicState) {
            this.intrinsicState = intrinsicState;
        }
    
        /**
         *          
         *                        
         * @return
         */
        public String getExternalState() {
            return externalState;
        }
    }
    

    III. 향원 모드 구체 향원 류
    1. 구체 적 인 향 원류 ConcreteFlyweight 정의:
    ① 계승: 이 종 류 는 AbstractFlyweight 추상 류 를 계승 한다.
    ② 구조 함수 재 작성: 추상 류 실현 류 는 구조 함수 재 작성 이 필요 하 다.
    ③ 추상 적 인 방법 을 실현 한다. 구체 적 인 향원류 에서 추상 적 인 향원류 중의 추상 적 인 행 위 를 실현 해 야 한다.
    2. 구체 적 인 메타 코드 예제:
    package kim.hsl.design.flyweight;
    
    /**
     *        
     *            ,            
     */
    public class ConcreteFlyweight extends AbstractFlyweight {
        public ConcreteFlyweight(String externalState) {
            super(externalState);
        }
        @Override
        void action() {
            System.out.println("       ,      : " + externalState);
        }
    }
    

    IV. 향 원 모드 향 원 공장
    1. 향 원 공장 클래스 정의:
    ① 대상 풀: 향 원 공장 류 에서 정적 인 HashMap 데이터 구 조 를 유지 합 니 다. 이것 이 바로 대상 풀 이 메모리 에 있 는 데이터 구조 입 니 다. 키 String 데 이 터 는 원 류 를 누 리 는 외부 상태 이 고 향 원 대상 의 신분 표지 로 사용 되 며 모든 향 원 대상 의 이 외부 상태 값 이 다 릅 니 다.
    ② 대상 풀 에서 대상 획득: HashMap OBJECTPOOL 대상 풀 에서 AbstractFlyweight 추상 적 인 메타 대상 을 가 져 올 때 대상 풀 에 이 데이터 가 있 는 지 확인 하고 map. get () 을 사용 하여 가 져 온 메타 대상 이 비어 있 지 않 으 면 대상 풀 에 이 데이터 가 있 음 을 설명 하고 바로 돌아 가면 됩 니 다.map. get () 에서 가 져 온 향 원 대상 이 비어 있 으 면 대상 풀 에 이 대상 이 없다 는 것 을 설명 합 니 다. 이 대상 을 만 들 고 대상 풀 에 넣 고 돌아 가 야 합 니 다.외부 상 태 를 사용 하여 구조 함수 생 성 대상 에 전송 하 는 것 을 주의 하 십시오.
    2. 향 원 공장 류 코드 예시:
    package kim.hsl.design.flyweight;
    
    import java.util.HashMap;
    
    /**
     *     
     *      
     */
    public class FlyweightFactory {
        /**
         *    
         *      ,        
         *         
         *       ,        ,       ,        
         *   :        :     
         */
        private static final HashMap<String, AbstractFlyweight> OBJECT_POOL = new HashMap<String, AbstractFlyweight>();
        public static AbstractFlyweight getObject(String externalState){
            //         
            ConcreteFlyweight object = (ConcreteFlyweight) OBJECT_POOL.get(externalState);
            //           
            if(object == null){
                object = new ConcreteFlyweight(externalState);
                OBJECT_POOL.put(externalState, object);
                System.out.println("             : " + externalState + " ,       ");
            }else{
                System.out.println("            ,        : " + externalState);
            }
            return object;
        }
    }
    

    V. 향 원 모드 사용자 호출
    1. 사용자 호출:
    ① 사용자 성명 대상 유형: 사용 자 는 AbstractFlyweight 가 원 류 를 추상 적 으로 누 리 는 대상 을 성명 하고 원 공장 류 의 대상 풀 에서 대상 을 얻는다.
    ② 새 대상: 대상 풀 에 대상 이 없 으 면 구조 함 수 를 호출 하여 이 대상 을 만 들 고 대상 풀 에 넣 고 이 대상 을 되 돌려 줍 니 다.
    ② 재 활용 대상: 대상 풀 에 이 향원 대상 이 있 으 면 스 레 드 풀 에서 이 대상 을 직접 가 져 와 되 돌려 줍 니 다.
    2. 사용자 호출 코드 예제:
    package kim.hsl.design.flyweight;
    
    public class Main {
        /**
         *    :        ,           
         * @param args
         */
        public static void main(String[] args) {
            //       "tom" ,          ,         ,            
            AbstractFlyweight tom = FlyweightFactory.getObject("tom");
            tom.action();
    
            //       "tom"           ,            
            AbstractFlyweight tom2 = FlyweightFactory.getObject("tom");
            tom2.action();
    
            //       "Jerry" ,          ,         ,            
            AbstractFlyweight jerry = FlyweightFactory.getObject("Jerry");
            jerry.action();
        }
    }
    

    좋은 웹페이지 즐겨찾기