Yan Hong 박사의 저서 "Java and Mode"에서 플라이급 모드에 대한 설명으로 시작합니다.
Flyweight는 가장 가벼운 중량 수준, 즉 "Flyweight"또는 "Rain Level"을 나타냅니다. "Xienyuan 모드"의 번역은 여기에서 선택됩니다. 이는 모드의 의도를 더 잘 반영 할 수 있기 때문입니다. 백과 사전 패턴은 물체의 구조적 패턴입니다. 백과 사전 모드는 공유 방식으로 많은 수의 세밀한 물체를 효율적으로 지원합니다.
Java의 문자열 유형
Java 언어에서 문자열 유형은 백과 사전 모드를 사용합니다. 문자열 객체는 최종 유형이며 일단 생성되면 변경할 수 없습니다. Java에서는 상수 풀에 문자열 상수가 있습니다. Java는 문자열 상수에 상수 풀에 사본이 하나뿐입니다. 문자열 a = "abc", 여기서 "ABC"는 문자열 상수입니다.
공개 클래스 테스트 {public static void main (String [] args) {문자열 a = "abc"; 문자열 b = "abc"; System.out.println (a == b); }}위의 예에서 결과는 사실입니다. 이는 A와 B가 상수 풀에서 동일한 문자열 상수 "ABC"를 참조 함을 의미합니다. 이러한 설계는 n 이상의 동일한 개체를 생성 할 때 발생하는 많은 양의 자원 소비를 피합니다.
즐거움 모델의 구조
쾌락 모델은 동일한 컨텐츠 객체를 갖는 오버 헤드를 피하기 위해 공유를 채택합니다. 이 오버 헤드에서 가장 일반적이고 직관적 인 것은 메모리 손실입니다. 백과 사전 개체를 공유하는 열쇠는 내부 상태 와 외부 상태를 구별하는 것입니다.
본질적인 상태는 Xiangyuan 물체 안에 저장되며 환경에 따라 다르지 않습니다. 따라서 희생 요소는 본질적인 상태를 가질 수 있으며 공유 할 수 있습니다.
외부 상태는 환경의 변화에 따라 변경되며 공유 할 수 없습니다. Xiangyuan 객체의 외부 상태는 클라이언트에 의해 저장되어야하며, Xiangyuan 객체가 만들어진 후에는 사용이 필요할 때 Xiangyuan 객체로 전달됩니다. 외부 상태는 살아있는 대상의 내부 상태에 영향을 줄 수 없으며 서로 독립적입니다.
즐거운 유안 모드는 두 가지 형태로 나눌 수 있습니다.
간단한 즐거움 모드
간단한 현존 모드에서는 모든 현존하는 물체를 공유 할 수 있습니다.
간단한 즐거움 모드와 관련된 역할은 다음과 같습니다.
초록 플라이급 역할 : 모든 특정 플라이급 역할을 구현 해야하는 메소드를 지정하기위한 추상 인터페이스를 제공합니다.
ConcreteFlyweight 역할 : 추상 Xiangyuan 역할에 의해 지정된 인터페이스를 구현합니다. 본질적인 상태가있는 경우 고유 상태를위한 저장 공간을 제공해야합니다.
Flyweightorfactory 역할 : 이 역할은 Xiangyuan 역할을 만들고 관리하는 데 책임이 있습니다. 이 역할은 시스템에서 즐거움 개체를 올바르게 공유 할 수 있도록해야합니다. 클라이언트 객체가 Xiangyuan 객체를 호출 할 때, Xiangyuan Factory 역할은 이미 시스템의 요구 사항을 충족시키는 Xiangyuan 객체가 있는지 확인합니다. 이미 존재하는 경우 Xiangyuan 공장 역할은 기존 Xiangyuan 객체를 제공해야합니다. 시스템에 적절한 Xiangyuan 객체가 없으면 Xiangyuan 공장 역할은 적절한 Xiangyuan 객체를 만들어야합니다.
소스 코드
추상 캐릭터 클래스
public interface flyweight {// 회로도 메소드, 매개 변수 상태는 외부 상태 공개 void 연산 (String State);}입니다.특정 백과 사전 문자 클래스 ConcreteFlyweight는 본질적인 상태를 가지고 있습니다. 이 예에서는 문자 유형의 내재적 상태 속성이 나타나고 백과 사전 객체가 생성 될 때 값을 할당해야합니다. 객체가 생성 된 후에는 모든 고유 상태가 변경되지 않습니다.
희생적인 물체에 외부 상태가있는 경우 모든 외부 상태는 클라이언트에 저장되어야합니다. 희생적인 대상을 사용할 때, 희생적인 대상은 클라이언트가 희생적 대상으로 전달됩니다. 여기에는 하나의 외부 상태 만 있으며, 작동 () 메소드의 매개 변수 상태는 외부에서 전달되는 외부 상태입니다.
공개 클래스 ConcreteFlyweight는 Flyweight {개인 문자 INTRINSICSTATE = NULL을 구현합니다. / *** 생성자, 고유 상태는 매개 변수로 전달됩니다* @param state*/ public concreteflyweight (문자 상태) {this.intrinsicstate = state; } /** * 외부 상태는 메소드의 매개 변수로 전달되어 방법의 동작을 변경하지만 객체의 고유 상태를 변경하지는 않습니다. */ @override public void 작동 (문자열 상태) {// todo 자동 생성 메소드 스터브 시스템.out.println ( "Intrinsic State =" + this.intrinsicstate); System.out.println ( "extrinsic state =" + state); }}Xiangyuan Factory 역할 클래스의 경우 클라이언트가 특정 Xiangyuan 클래스를 직접 인스턴스화 할 수는 없지만 Xiangyuan 객체를 얻기 위해 Factory () 메소드를 사용해야합니다. 일반적으로 전체 시스템에는 Xiangyuan Factory 객체가 하나만 있으므로 싱글 톤 모드도 사용할 수 있습니다.
클라이언트가 간단한 즐거움 개체가 필요할 때, Factory () Method of the Enjoy Factory의 필수 내부 상태를 통과해야하며 공장 방법은 필요한 즐거움 객체를 생성해야합니다.
공개 클래스 FlyweightFactory {private map <문자, flyweight> files = new Hashmap <문자, flyweight> (); Public Flyweight Factory (캐릭터 상태) {// Cache Flyweight Fly = Files.get (State)에서 객체를 먼저 찾습니다. if (fly == null) {// 객체가 존재하지 않으면 새 플라이급 객체를 만듭니다. fly = new ConcreteFlyweight (State); //이 새 플라이급 객체를 캐시 파일에 추가합니다 .PUT (state, fly); } 반환 비행; }}클라이언트 클래스
public class client {public static void main (String [] args) {// todo 자동 생성 메소드 Stub FlyweightFactory Factory = New FlyweightFactory (); flyweight fly = factory.factory (새 문자 ( 'a')); fly.operation ( "첫 번째 호출"); fly = factory.factory (새 문자 ( 'b')); fly.operation ( "두 번째 호출"); fly = factory.factory (새 문자 ( 'a')); fly.operation ( "세 번째 호출"); }}클라이언트는 세 가지 희생적인 대상을 신청했지만 실제로 생성 된 희생적인 대상은 두 개 뿐이며, 이는 공유의 의미입니다. 작업 결과는 다음과 같습니다.
복잡한 즐거움 모드
간단한 즐거움 모드에서 모든 즐거움 대상은 간단한 즐거움 대상이므로 직접 공유 할 수 있습니다. 또한 일부 간단한 외적 사용 합성 모드가 결합되어 복합 외부 물체를 형성하는 더 복잡한 상황이 있습니다. 이러한 복합 메타 엔 조이 객체는 자체적으로 공유 할 수는 없지만 간단한 메타 유쾌한 객체로 나눌 수 있으며 후자는 공유 할 수 있습니다.
화합물 Xiangyuan 캐릭터와 관련된 캐릭터는 다음과 같습니다.
초록 플라이급 역할 : 모든 특정 플라이급 역할을 구현 해야하는 메소드를 지정하기위한 추상 인터페이스를 제공합니다.
ConcreteFlyweight 역할 : 추상 Xiangyuan 역할에 의해 지정된 인터페이스를 구현합니다. 본질적인 상태가있는 경우 고유 상태를위한 저장 공간을 제공해야합니다.
CompositeCompositeFlyweight 역할 : 복합 공유로 표시되는 객체를 공유 할 수는 없지만 복합 공유 객체는 단순히 객체를 공유하는 객체의 여러 조합으로 분해 될 수 있습니다. 화합물 외적 역할을 공유되지 않은 외부 물체라고도합니다.
Flyweightorfactory 역할 :이 역할은 Xiangyuan 역할을 만들고 관리하는 데 책임이 있습니다. 이 역할은 시스템에서 즐거움 개체를 올바르게 공유 할 수 있도록해야합니다. 클라이언트 객체가 Xiangyuan 객체를 호출 할 때, Xiangyuan Factory 역할은 이미 시스템의 요구 사항을 충족시키는 Xiangyuan 객체가 있는지 확인합니다. 이미 존재하는 경우 Xiangyuan 공장 역할은 기존 Xiangyuan 객체를 제공해야합니다. 시스템에 적절한 Xiangyuan 객체가 없으면 Xiangyuan 공장 역할은 적절한 Xiangyuan 객체를 만들어야합니다.
소스 코드
추상 캐릭터 클래스
public interface flyweight {// 회로도 메소드, 매개 변수 상태는 외부 상태 공개 void 연산 (String State);}입니다. 특정 즐거움 역할 수업
공개 클래스 ConcreteFlyweight는 Flyweight {개인 문자 INTRINSICSTATE = NULL을 구현합니다. / *** 생성자, 고유 상태는 매개 변수로 전달됩니다* @param state*/ public concreteflyweight (문자 상태) {this.intrinsicstate = state; } /** * 외부 상태는 메소드의 매개 변수로 전달되어 방법의 동작을 변경하지만 객체의 고유 상태를 변경하지는 않습니다. */ @override public void 작동 (문자열 상태) {// todo 자동 생성 메소드 스터브 시스템.out.println ( "Intrinsic State =" + this.intrinsicstate); System.out.println ( "extrinsic state =" + state); }}복합 외 객체는 복합을 통한 순수한 외적 물체로 구성되므로 add ()와 같은 집계 관리 방법을 제공합니다. 복합 메타 객체는 다른 집계 요소를 가지기 때문에 복합 메타 객체가 생성 된 후 이러한 집계 요소가 추가됩니다.이 자체는 복합 메타 객체의 상태가 변경되므로 복합 메타 객체를 공유 할 수 없습니다.
화합물 외적 역할은 추상 외적 역할, 즉 Operation () 방법에 의해 지정된 인터페이스를 구현합니다. 이 방법에는 복합 외 객체의 외부 상태를 나타내는 매개 변수가 있습니다. 복합 즐거움 대상의 모든 요소의 외부 상태는 복합 즐거움 대상의 외부 상태와 동일합니다. 복합 즐거움 대상에 포함 된 단순한 즐거움 대상의 내부 상태는 일반적으로 같지 않지만, 그렇지 않으면 사용 가치가 없습니다.
공개 클래스 ConcretecompositeFlyweight 플라이급 {private map <문자, flyweight> files = new Hashmap <문자, flyweight> (); / *** 클러스터에 새로운 간단한 메타 절약 객체를 추가*/ public void add (문자 키, 플라이급 플라이) {files.put (키, 플라이); } / *** 외부 상태는 매개 변수로 메소드로 전달됩니다* / @override public void 작동 (String State) {flyweight fly = null; for (object o : files.keyset ()) {fly = files.get (o); fly.operation (State); }}} Xiangyuan Factory 역할은 두 가지 다른 방법을 제공합니다. 하나는 간단한 Xiangyuan 객체를 제공하고 다른 하나는 복합 Xiangyuan 객체를 제공하기위한 것입니다.
공개 클래스 FlyweightFactory {private map <문자, flyweight> files = new Hashmap <문자, flyweight> (); / *** Compound Xiangyuan Factory Method*/ public flyweight factory (list <atirecompositestate) {ConcretecompositeFlyweight CompositeFly = New ConcreteCompositeFlyweight (); for (문자 상태 : compositestate) {compositefly.add (state, this.factory (state)); } return compositeFly; } /*** 간단한 백과 사전 공장 방법* /public flyweight factory (캐릭터 상태) {// 우선 캐시 플라이 웨이트 fly = files.get (state)에서 개체를 찾습니다. if (fly == null) {// 객체가 존재하지 않으면 새 플라이급 객체를 만듭니다. fly = new ConcreteFlyweight (State); //이 새 플라이급 객체를 캐시 파일에 추가합니다 .PUT (state, fly); } 반환 비행; }} 클라이언트 역할
public class client {public static void main (String [] args) {list <문자> compositestate = new Arraylist <atiregion> (); compositestate.add ( 'a'); compositestate.add ( 'b'); compositestate.add ( 'c'); compositestate.add ( 'a'); compositestate.add ( 'b'); FlyweightFactory FlyFactory = New FlyweightFactory (); flyweight compositefly1 = flyfactory.factory (compositestate); flyweight compositefly2 = flyfactory.factory (compositestate); CompositeFly1.Operation ( "Composite Call"); System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ flyfactory.factory (state).작업 결과는 다음과 같습니다.
작업 결과에서 복합 즐거움 개체의 모든 요소의 외부 상태는 복합 즐거움 개체의 외부 상태와 동일하다는 것을 알 수 있습니다. 즉, 외부 운세 상태는 복합 호출과 같습니다.
작동 결과로부터, 복합 현존하는 물체에 포함 된 단순한 현존 물체의 의미 상태는 일반적으로 불평등하다는 것을 알 수있다. 즉, 내부 상태는 B, C 및 a입니다.
실행 결과에서 복합 공유 객체를 공유 할 수 없음을 알 수 있습니다. 즉, 공장을 통해 동일한 객체 compositestate를 두 번 사용하여 생성 된 객체는 동일한 객체가 아닙니다.
작업 결과에서 단순히 요소를 즐기는 것을 공유 할 수 있음을 알 수 있습니다. 즉, 동일한 객체 상태를 사용하여 공장을 통해 생성 된 객체는 동일한 객체입니다.
Xiangyuan 모델의 장단점
백과 사전 모드의 장점은 메모리의 객체 수를 크게 줄이는 것입니다. 그러나이를 위해 지불하는 가격도 매우 높습니다.
백과 사전 모드는 시스템을보다 복잡하게 만듭니다. 객체를 공유하려면 일부 주가 외부화되어야하므로 프로그램의 논리를 복잡하게 만듭니다.
쾌락 모드는 즐기는 물체의 상태를 외부화하고 외부 상태를 읽으면 달리기 시간이 약간 길어집니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.