11. 향원 모드(디자인 모드 노트)

3683 단어

장면


메모리는 희소한 자원에 속하니 함부로 낭비해서는 안 된다.만약 완전히 같거나 비슷한 대상이 많다면, 우리는 향원 모드를 통해 메모리를 절약할 수 있다

핵심

  • 향원 모델은 공유의 방식으로 대량의 세립도 대상의 중용을 효율적으로 지원한다
  • 향원 모델이 공유할 수 있는 관건은 내부 상태와 외부 상태를 구분하는 것이다.
  • 내부 상태: 환경 변화에 따라 공유할 수 있음
  • 외부 상태: 공유할 수 없으며 환경에 따라 달라질 수 있음

  • 3. 실례: 바둑 소프트웨어 디자인


    바둑돌마다 하나의 대상이 있는데 다음과 같은 속성이 있다. 색깔, 모양, 크기 등 세 가지 속성은 공유할 수 있지만 위치 속성은 공유할 수 없다.

    4. 형원 모델의 실현

  • FlyWeightFactory향원공장류: 향원대상을 창설하고 관리하며, 향원못은 일반적으로 키값 쌍으로 설계
  • FlyWeight추상적 향원류: 일반적으로 하나의 인터페이스나 추상류로 공공 방법을 성명한다. 이런 방법은 외부에 대상의 내부 상태를 제공하고 외부 상태를 설정할 수 있다
  • ConcreteFlyWeight세부 향원류: 내부 상태에 구성원 변수를 제공하여 저장
  • UnsharedConcreteFlyWeight 비공유 향원류: 공유할 수 없는 하위 클래스는 비공유 향원류로 설계할 수 있다
  • 5. 실례: 바둑을 간단하게 실현

    ChessFlyWeight.java
    package cn.itcast.day242.flyWeight;
    // 
    public interface ChessFlyWeight {
        public void setColor(String color);//  
    
        public String getColor();//  
    
        public void display(Coordinate c);//  
    }
    
    //  
    class ConcreteChess implements ChessFlyWeight {
    
        private String color;//  
    
        public ConcreteChess(String color) {
            this.color = color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        public String getColor() {
            return color;
        }
    
        public void display(Coordinate c) {
            System.out.println(" :" + color);
            System.out.println(" :" + c.getX() + "," + c.getY());
        }
    }
    
    Coordinate.java
    package cn.itcast.day242.flyWeight;
    // : UnsharedConcreteFlyWeight
    public class Coordinate {
        private int x;
        private int y;
    
        public Coordinate(int x, int y) {
            this.x = x;
            this.y = y;
        }
    
        public int getX() {
            return x;
        }
    
        public void setX(int x) {
            this.x = x;
        }
    
        public int getY() {
            return y;
        }
    
        public void setY(int y) {
            this.y = y;
        }
    }
    
    ChessFlyWeightFactory.java
    package cn.itcast.day242.flyWeight;
    import java.util.HashMap;
    import java.util.Map;
    
    // 
    public class ChessFlyWeightFactory {
        //  
        private static Map map = new HashMap();
    
        public static ChessFlyWeight getChess(String color) {
            ChessFlyWeight c = map.get(color);
            if (c != null) {
                return c;
            } else {
                c = new ConcreteChess(color);
                map.put(color, c);
                return c;
            }
        }
    }
    
    Client.java
    package cn.itcast.day242.flyWeight;
    public class Client {
        public static void main(String[] args) {
            ChessFlyWeight chess1 = ChessFlyWeightFactory.getChess(" ");
            ChessFlyWeight chess2 = ChessFlyWeightFactory.getChess(" ");
            System.out.println(chess1);
            System.out.println(chess2);
            
            System.out.println(" ");
            chess1.display(new Coordinate(10, 10));
            chess2.display(new Coordinate(20, 20));
        }
    }
    

    설명: 위에서 사용한 방식과 같이 우리는 위의 두 종류가 사실은 같은 종류이고 내부 정보(색깔)는 공유되지만 외부 정보(좌표)는 독립적이라는 것을 알 수 있다.

    장면

  • 향원 모델은 공유된 특성 때문에 모든 연못에서 조작할 수 있다. 예를 들어 연못, 데이터베이스 연결 연못이다.String류의 디자인도 향원 모델
  • 장점

  • 메모리에 있는 개체 수 대폭 감소
  • 동일 또는 유사 개체 메모리에 하나만 저장하여 리소스를 크게 절약하고 시스템 성능 향상
  • 외부 상태가 상대적으로 독립되어 내부 상태에 영향을 주지 않는다
  • 결점

  • 모델이 비교적 복잡하고 프로그램 논리를 복잡하게 한다
  • 메모리를 절약하기 위해 내부 상태를 공유하고 외부 상태를 분리하며 외부 상태를 읽으면 운행 시간이 길어지고 시간으로 공간을 바꾼다.
  • 좋은 웹페이지 즐겨찾기