디자인 모드 학습 노트 (13) - 향 원 모드

4455 단어 디자인 모드
본인 이 만 든 디자인 모델 학습 노트 시리즈 의 박문 은 개인 학습 에 사용 되 는 데 목적 을 두 고 주로 자신 이 디자인 모델 에 대한 이해 와 코드 의 실현 을 기록 하 는 데 목적 을 둡 니 다.
향 원 모드 (Flyweight Pattern)
    바둑 게임 에서 유 저 는 2 - 6 명 이 고 모든 유 저 는 각자 한 가지 색깔 의 바둑 알 을 사용 할 수 있 습 니 다.현재 두 명의 유저 만 있다 고 가정 하고 빨간색 과 파란색 바둑 알 을 각각 사용한다.파란색 바둑돌 로 말하자면, 파란색 바둑돌 의 모든 바둑돌 은 좌 표를 제외 하고 색깔 이 모두 같다.그러면 색깔 이 파란색 인 것 은 파란색 바둑돌 의 내부 공 통 된 속성 이다. 파란색 바둑돌 의 서로 다른 상 태 는 바둑판 의 위치 에 있 고 파란색 바둑돌 의 외부 속성 으로 볼 수 있다.이 를 통 해 알 수 있 듯 이 우리 가 바둑 게임 소프트웨어 를 실현 하려 면 모든 바둑 알 에 똑 같은 자원 을 분배 하면 자원 낭 비 를 초래 할 수 있다.자원 의 지출 을 줄 이기 위해 서 이 를 통 해 향원 모델 을 도입 하 다.내 가 보기에 한 대상 중 일부 속성 은 몇 개의 대상 을 만 들 든 인 스 턴 스 는 변 하지 않 고 다른 부분 은 상황 에 따라 변 할 때 향 원 모드 를 사용 하여 이 대상 을 실현 할 수 있다.    는 향원 모델 에 포 함 된 역할 은 추상 향원 류 (Flyweight), 구체 향원 류 (Concrete Flyweight), 향원 공장 류 (Flyweight Factory) 가 있다.향 원 공장 에 서 는 향 원 지 를 유지 해 향 원 대상 을 보관 하 는 데 쓰 인 다.상기 글 중의 빨간색 과 파란색 쌍방 이 바둑 을 두 며 대국 하 는 것 을 예 로 들 어 demo 를 드 립 니 다.
import java.util.HashMap;

/*
 *   ,     
 * */
abstract class Chess{
    protected String color;
    public abstract void placeChess(int x,int y);
}

/*
 *   ,     
 * */
class ConcreteChess extends Chess{
    public ConcreteChess() {
        super();
    }

    public ConcreteChess(String color){
        this.color=color;
    }


    @Override
    public void placeChess(int x, int y) {
        System.out.println("  :"+this.color+"   :("+x+","+y+")");
    }
}

/*
 *      
 * */
class ChessFactory{
    //   
    private static HashMap hashMap=new HashMap();

    public static Chess getChess(String color){
        if(hashMap.containsKey(color)){
            System.out.println("Get Chess From Flyweight Pool");
            return hashMap.get(color);
        }else{
            ConcreteChess newChess=new ConcreteChess(color);
            hashMap.put(color, newChess);
            return newChess;
        }
    }
}



public class FlyweigthPattern {
    public static void main(String[] args){
         ConcreteChess redChess=(ConcreteChess)ChessFactory.getChess("red");
         ConcreteChess blueChess=(ConcreteChess)ChessFactory.getChess("blue");

         redChess.placeChess(1, 1);
         blueChess.placeChess(2, 2);

         redChess=(ConcreteChess)ChessFactory.getChess("red");
         blueChess=(ConcreteChess)ChessFactory.getChess("blue");
    }
}

실행 결과 바둑 알: red 위치: (1, 1) 바둑 알: blue 위치: (2, 2) Get Chess From Flyweight Pool

좋은 웹페이지 즐겨찾기