디자인 모드 (22) - 향 원 모드

5330 단어 디자인 모드
정의.
대상 의 속성 은 보통 공유 속성 (예 를 들 어 직무, 등급, 부서) 과 개성 속성 (예 를 들 어 이름, id) 의 구분 이 있 습 니 다. 공유 속성의 값 은 수량 을 열거 하거나 예측 할 수 있 습 니 다. 대상 의 대량 중복 생 성 으로 인해 메모리 자원 의 낭 비 를 피하 기 위해 공유 속성 을 대상 으로 분리 할 수 있 고 개성 속성 을 방법 중의 매개 변수 로 전달 할 수 있 습 니 다. 이것 이 바로 향원 모델 입 니 다.
주: 디자인 모델 의 선 에서 예 를 들 면 적합 하지 않 습 니 다. 공유 속성 과 개성 속성 을 같은 대상 에 밀봉 하고 대상 이 개성 속성의 set 작업 이 발생 하면 반드시 전체 적 으로 볼 수 있 고 스 레 드 안전 문제 가 발생 합 니 다.
주: 전역 맵 에서 추출 한 대상 은 반드시 전역 공유 이 며, 모든 스 레 드 는 get 을 통 해 추출 한 대상 은 같은 대상 입 니 다.
예시
향 원 모드 응용 은 흔히 볼 수 있 습 니 다. 예 를 들 어 자바 의 문자열 대상 은 향 원 대상 이 고 문서 의 자모 도 향 원 대상 입 니 다.
1. 인터페이스
public interface Shape {
    public void draw(int x,int y,int r);
}

2. 향원 대상
public class Circle implements Shape{
    //     ,x  ,y  ,r      ,                  
    private final String color; //  

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

    public String getColor(){
        return this.color;
    }


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

3. 향 원 공장
public class CircleFlyweightFactory {
    //       key,      value
    private final static HashMap flyweights = new HashMap();

    public static Circle getCircle(String color){
        Circle circle = null;
        //    ,             ,      ,           .
        if(flyweights.containsKey(color)){
            circle = flyweights.get(color);
        }else{
            synchronized(CircleFlyweightFactory.class){
                if(!flyweights.containsKey(color)){
                    circle = new Circle(color);
                    flyweights.put(color, circle);
                }
            }
        }
        return circle;
    }
}

4. 실행
public class Client {
    public static void main(String[] args) {
        Random random = new Random();
        String[] colors = {"  ","  ","  "};
        for(int i=0;i<20;i++){
            Shape circle = CircleFlyweightFactory.getCircle(colors[random.nextInt(3)]);
            circle.draw(random.nextInt(100), random.nextInt(100), random.nextInt(100));
        }
    }
}

결과:
    :     ,x   4,y   51,   79
    :     ,x   44,y   72,   36
    :     ,x   63,y   10,   3
    :     ,x   42,y   25,   60
    :     ,x   92,y   16,   71
    :     ,x   28,y   61,   50
    :     ,x   68,y   28,   94
    :     ,x   89,y   4,   35
    :     ,x   24,y   46,   9
    :     ,x   81,y   56,   29
    :     ,x   39,y   71,   25
    :     ,x   52,y   74,   13
    :     ,x   59,y   6,   3
    :     ,x   27,y   90,   22
    :     ,x   50,y   44,   87
    :     ,x   63,y   83,   89
    :     ,x   70,y   80,   52
    :     ,x   83,y   80,   44
    :     ,x   11,y   48,   52
    :     ,x   31,y   48,   9

좋은 웹페이지 즐겨찾기