향 원 모드 (Flyweight Pattern)

4115 단어 디자인 모드
메모리 사용량 을 줄 이 고 성능 을 향상 시 키 기 위해 메타 모드 (Flyweight Pattern) 를 사용 합 니 다.이런 유형의 디자인 모델 은 구조 형 모델 로 대상 의 수량 을 줄 이 고 응용 에 필요 한 대상 구 조 를 개선 하 는 방식 을 제공 했다.의도: 공유 기술 을 활용 하여 대량의 입자 도 를 효과적으로 지원 하 는 대상.
주요 해결: 대량의 대상 이 있 을 때 메모리 가 넘 칠 수 있 습 니 다. 우 리 는 그 중의 공 통 된 부분 을 추상 화하 고 똑 같은 업무 요청 이 있 으 면 메모리 에 있 는 대상 으로 돌아 가 다시 만 들 지 않도록 합 니 다.
언제 사용: 1. 시스템 에 대량의 대상 이 있 습 니까?2. 이 대상 들 은 대량의 메모 리 를 소모 합 니 다.3. 이들 대상 의 상 태 는 대부분 외부 화 할 수 있다.4. 이러한 대상 은 내 포 된 상태 에 따라 여러 조로 나 눌 수 있 으 며, 내 포 된 대상 을 대상 에서 제거 할 때 각 조 의 대상 은 하나의 대상 으로 대체 할 수 있다.5. 시스템 은 이러한 대상 의 신분 에 의존 하지 않 고 이런 대상 은 분별 할 수 없다.
어떻게 해결 합 니까? 유일한 표지 코드 로 판단 하고 메모리 에 있 으 면 이 유일한 표지 코드 가 표 시 된 대상 을 되 돌려 줍 니 다.
핵심 코드: 이 대상 들 을 HashMap 으로 저장 합 니 다.
인 스 턴 스: 1. JAVA 의 String, 있 으 면 되 돌려 주 고 없 으 면 문자열 캐 시 풀 에 저장 할 문자열 을 만 듭 니 다.2. 데이터베이스 의 데이터 풀.
장점: 대상 의 생 성 을 크게 줄 이 고 시스템 의 메모 리 를 낮 추어 효율 을 높 인 다.
단점: 시스템 의 복잡 도 를 향상 시 키 려 면 외부 상태 와 내부 상 태 를 분리 해 야 하고 외부 상 태 는 고유 화 된 성질 을 가지 기 때문에 내부 상태의 변화 에 따라 변화 해 서 는 안 되 며 그렇지 않 으 면 시스템 의 혼란 을 초래 할 수 있다.
사용 장면: 1. 시스템 에 대량의 유사 대상 이 있 습 니 다.2. 버퍼 가 필요 한 장면.
주의사항: 1. 외부 상태 와 내부 상 태 를 구분 하 는 것 을 주의 하 십시오. 그렇지 않 으 면 라인 안전 문 제 를 일 으 킬 수 있 습 니 다.2. 이런 유형 은 반드시 한 공장 대상 이 통제 해 야 한다.
인터페이스
package FlyweightPattern;

public interface Shape {

    void draw();
}
package FlyweightPattern;

public class Circle implements Shape {

    private String color;
    private int x;
    private int y;
    private int radius;

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

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }

    @Override
    public void draw() {
        System.out.println("Circle: Draw() [Color : " + color
                +", x : " + x +", y :" + y +", radius :" + radius);
    }

}


도형 공장 류
package FlyweightPattern;
import java.util.HashMap;

public class ShapeFactory {

    private static final HashMap circleMap = new HashMap<>();

    public static Shape getCircle(String color) {
        Circle circle = (Circle)circleMap.get(color);

        if(circle == null) {
            circle = new Circle(color);
            circleMap.put(color, circle);
            System.out.println("Creating circle of color : " + color);
        }
        return circle;
    }
}


원형 실현 류
package FlyweightPattern;

public class Circle implements Shape {

    private String color;
    private int x;
    private int y;
    private int radius;

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

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }

    @Override
    public void draw() {
        System.out.println("Circle: Draw() [Color : " + color
                +", x : " + x +", y :" + y +", radius :" + radius);
    }

}


클 라 이언 트 테스트 프로그램
package FlyweightPattern;

public class FlyweightPatternDemo {

    private static final String[] colors =
            {"Red", "Green", "Blue", "White", "Black"};

    public static void main(String[] args) {

        for (int i = 0; i < 20; ++i) {
            Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor());
            circle.setX(getRandomX());
            circle.setY(getRandomY());
            circle.setRadius(100);
            circle.draw();
        }
    }

    private static String getRandomColor() {
        return colors[(int) (Math.random() * colors.length)];
    }

    private static int getRandomX() {
        return (int) (Math.random() * 100);
    }

    private static int getRandomY() {
        return (int) (Math.random() * 100);
    }
}

참고:https://www.runoob.com/design-pattern/flyweight-pattern.html

좋은 웹페이지 즐겨찾기