Latest web development tutorials

플라이급

플라이급 (플라이 웨이트 패턴)은 주로 메모리 사용량을 줄이고, 성능을 향상시키기 위해 작성된 오브젝트의 수를 줄이기 위해 사용된다. 디자인 패턴이 종류의 애플리케이션에 의해 요구되는 방식으로 상기 객체의 구조를 개선하는 객체의 수의 감소를 제공하는 구조적 모델을 속한다.

플라이급은 일치 객체가 발견되지 않으면, 새로운 객체가 생성되고, 동일한 기존의 객체를 재사용하려고. 우리는이 패턴을 보여주기 위해 다섯 객체를 생성하여 다른 위치에 분산 된 20 원을 그릴 것입니다. 색상 속성이 기존원 개체를확인하는 데 사용되도록 가능한 색상의 다섯 종류입니다.

소개

의도 : 세분화 된 많은 수의 개체를 지원하기 위해 공유를 사용합니다.

주로 해결하기 위해 : 많은 수의 개체에서, 메모리 오버 플로우가 발생할 수 있습니다, 우리가 함께 직접 다시 동일한 서비스 요청 메모리에 기존 개체가있는 경우 추상, 재 작성하지 않도록, 상기 부분을 넣어.

사용하는 경우, 1, 시스템은 많은 수의 개체를 갖는다.2, 이러한 개체는 많은 양의 메모리를 소비합니다. 도 3에서, 이러한 객체의 대부분의 상태는 구체화 될 수있다. (4) 이러한 개체 많은 개체가 외부 윤 개체로부터 제거 극한 상태에 따라 그룹으로 분할 될 수 있고, 각 오브젝트가 아닌 오브젝트를 사용하여 설정 될 수있다. 도 5는 시스템이 개체의 신원에 의존하지 않고,이 개체는 구별된다.

해결 방법 : 메모리에 존재하는 경우 고유 식별 코드를 분석, 식별 된 오브젝트의 고유 식별 코드가 리턴된다.

키 코드 : 이러한 개체에 저장되는 HashMap.

적용 예 : 문자열 1, JAVA,이반환하는 경우, 다음 내부 문자열 버퍼 풀에 저장되어있는 문자열을 작성하지 않을 경우. 이 데이터베이스 풀.

장점 : 그 효율이 향상되도록 크게, 시스템 메모리를 줄일 목적의 생성을 감소시킨다.

단점 : 시스템의 비용 증가, 우리는 그렇지 않으면 혼란 시스템을 만들 것입니다, 내부 및 외부 상태 상태, 본질적으로 변화의 내부 상태로 변경해서는 안되는 성격의 외부 상태를 분리해야합니다.

사용 시나리오 1, 시스템은 유사한 다수의 객체를 갖는다.2 장면을 풀 필요가있다.

1 국가의 외부 및 내부 분열의 상태에주의를 지불, 또는 스레드 안전문제가 발생할 수 있습니다.2, 클래스는 팩토리 객체를 제어 할 수 있어야합니다.

실현

우리는 엔티티 클래스원 모양인터페이스의모양 인터페이스와구현을 작성합니다. 다음 단계는 팩토리 클래스의ShapeFactory을정의하는것입니다.

키 컬러원 객체라는이름의 HashMap의원이ShapeFactory. 요청이 수신 될 때마다, 특정 색 원을 생성한다. 발견서클 개체,개체가 반환되는 경우 원 객체에해당되는 HashMap을확인ShapeFactory,그렇지 않은 경우는 새로운 객체의 연속적인 사용을 위해 준비하는 해시 맵에 저장하고, 객체가 클라이언트에 반환됩니다 만듭니다.

FlyWeightPatternDemo, 우리의데모는 클래스가ShapeFactoryShape 객체를 사용하여 얻을 수 있습니다. 그것은 정보를 전송합니다(적색 / 녹색 / 블랙 / 블루/ 화이트)ShapeFactory에,그것은 개체의 색상을 얻을 필요가있다.

플라이급 패턴 UML 다이어그램

1 단계

인터페이스를 만듭니다.

Shape.java

공용 인터페이스 Shape {
   무효 무승부 ();
}

2 단계

인터페이스를 구현 엔티티 클래스를 만듭니다.

Circle.java

공용 클래스 서클 모양을 {구현
   개인 문자열 색상;
   개인 INT X;
   개인 INT y를;
   개인 INT 반경;

   공공 원 (문자열 색) {
      this.color = 색상;		
   }

   공공 무효의 setX (INT의 x)는 {
      this.x = X;
   }

   공공 무효 setY (INT y를) {
      this.y = Y;
   }

   공공 무효 setRadius (INT 반경) {
      this.radius = 반경;
   }

   @Override
   공공 무효 무승부 () {
      에서 System.out.println ( "원 : 그리기 () [색상 :"+ 색상 
         + "X :"+ X + ", Y :"+ Y + ", 반경 :"+ 반경);
   }
}

3 단계

주어진 정보에 기초하여 객체 엔티티 클래스를 생성하는 공장을 만든다.

ShapeFactory.java

수입 java.util.HashMap에;

공용 클래스 ShapeFactory {
   개인 정적 최종의 HashMap <문자열, 모양> circleMap = 새의 HashMap ();

   공공 정적 모양 getCircle (문자열 색) {
      원 원 = (원) circleMap.get (컬러);

      경우 (원 == NULL) {
         원 = 새로운 서클 (컬러);
         circleMap.put (색상, 원)
         에서 System.out.println ( "색상의 원 만들기 :"+ 색상)
      }
      원을 반환;
   }
}

4 단계

색 정보를 전달하여 클래스의 엔티티 객체를 획득하기 위해 상기 공장을 사용한다.

FlyweightPatternDemo.java

공용 클래스 FlyweightPatternDemo {
   개인 정적 최종 문자열 색상 [] = 
      { "레드", "녹색", "블루", "화이트", "블랙"};
   공공 정적 무효 메인 (문자열 []에 args) {

      (0 = 난을 int로, 내가 20 <; ++ 전) {
         원 원 = 
            (원) ShapeFactory.getCircle (getRandomColor ());
         circle.setX (getRandomX ());
         circle.setY (getRandomY ());
         circle.setRadius (100);
         circle.draw ();
      }
   }
   개인 정적 문자열 getRandomColor () {
      돌아 색상 [(int)를 (인 Math.random () * colors.length)]
   }
   개인 정적 INT getRandomX () {
      리턴 (INT) (인 Math.random () * 100);
   }
   개인 정적 INT getRandomY () {
      리턴 (INT) (인 Math.random () * 100);
   }
}

5 단계

출력을 확인합니다.

만들기 색상의 원 : 블랙
원 : 그리기 () [색상 : 블랙, X : 36, Y : 71, 반경 : 100
만들기 색상의 원 : 녹색
원 : 그리기 () [색상 : 녹색, 여기서 x : 27, y는 27, 반경 : 100
색상의 원을 만들기 : 화이트
원 : 그리기 () [색상 : 흰색, 여기서 x : 64, y는 10, 반경 : 100
색상의 원을 만들기 : 레드
원 : 그리기 () [색상 : 빨강, 여기서 x : 15, y는 44, 반경 : 100
원 : 그리기 () [색상 : 녹색, 여기서 x : 19, y는 10, 반경 : 100
원 : 그리기 () [색상 : 녹색, 여기서 x : 94, y는 32, 반경 : 100
원 : 그리기 () [색상 : 흰색, 여기서 x : 69, y는 : 98, 반경 : 100
색상의 원을 만들기 : 블루
원 : 그리기 () [색상 : 블루, X : 13, Y : 4, 반경 : 100
원 : 그리기 () [색상 : 녹색, 여기서 x : 21, y는 : 21, 반경 : 100
원 : 그리기 () [색상 : 블루, X : 55, Y : 86, 반경 : 100
원 : 그리기 () [색상 : 흰색, 여기서 x : 90, y는 70, 반경 : 100
원 : 그리기 () [색상 : 녹색, X : 78, Y : 3, 반경 : 100
원 : 그리기 () [색상 : 녹색, 여기서 x : 64, y는 : 89, 반경 : 100
원 : 그리기 () [색상 : 블루, X : 3, Y : 91, 반경 : 100
원 : 그리기 () [색상 : 블루, X : 62, Y : 82, 반경 : 100
원 : 그리기 () [색상 : 녹색, 여기서 x : 97, y는 : 61, 반경 : 100
원 : 그리기 () [색상 : 녹색, 여기서 x : 86, y는 12, 반경 : 100
원 : 그리기 () [색상 : 녹색, 여기서 x : 38, y는 : 93, 반경 : 100
원 : 그리기 () [색상 : 빨강, 여기서 x : 76, y는 : 82, 반경 : 100
원 : 그리기 () [색상 : 블루, X : 95, Y : 82, 반경 : 100