|
|
게시됨 2018. 7. 30. 오전 10:30:45
|
|
|

소개
플라이웨이트 모드는 공유 기술을 실행하여 많은 세밀한 객체를 효과적으로 지원하며, 동일한 콘텐츠를 가진 많은 소규모 클래스의 오버헤드(예: 메모리 소모)를 피하고, 모두가 클래스를 공유할 수 있게 합니다(메타클래스).
프로그래밍에서는 데이터를 표현하기 위해 많은 세밀한 수준 클래스 인스턴스를 생성해야 할 때가 있는데, 이 인스턴스들이 기본적으로 동일한 오버헤드를 가지지만 몇 가지 매개변수만 다르면 인스턴스화해야 할 클래스 수를 크게 줄일 수 있습니다. 이 매개변수들을 클래스 인스턴스 밖으로 옮기고 메서드가 호출될 때 전달할 수 있다면, 공유함으로써 개별 인스턴스 수를 크게 줄일 수 있습니다.
자바스크립트에서 메타 모드를 적용하면 어떨까요? 두 가지 방법이 있는데, 첫 번째는 주로 메모리 내 많은 유사한 객체에 데이터 계층에 적용됩니다; 두 번째는 DOM 계층에 적용되며, 중앙 이벤트 관리자에서 사용할 수 있어 부모 컨테이너의 각 자식 요소에 이벤트 핸들을 부착하는 것을 피할 수 있습니다.
메타버스와 데이터 레이어를 즐기세요
플라이웨이트에는 두 가지 중요한 개념이 있습니다 - 내부 상태 내재적 상태와 외부 상태 외재적 상태입니다. 내부 상태는 객체 내에서 내부 메서드를 통해 관리되며, 외부 정보는 삭제하거나 외부에서 저장할 수 있습니다.
솔직히 말해, 먼저 원본 모델을 핀칭하고, 다양한 상황과 환경을 적용한 후 고유한 특성을 가진 특정 모델을 만드는 것입니다. 당연히 새로운 객체를 생성해야 하므로, 공장 모드는 종종 플라이웨이트 모드에 나타나고, 플라이웨이트의 내부 상태는 공유에 사용되며, 플라이웨이트 공장은 내부 상태의 객체를 저장하는 플라이웨이트 풀(패턴 풀)을 유지하는 역할을 합니다.
위안위안 모드를 사용하세요
만약 모든 책을 관리할 도서관이 있다면, 각 책의 메타데이터는 대략 다음과 같을 것입니다:
신분증 타이틀 저자 장르 페이지 수 출판사 ID ISBN 또한 각 책이 언제, 누가 대출했는지, 반환 날짜와 이용 가능 여부도 정의해야 합니다:
체크아웃 날짜 체크아웃 멤버 기한복귀 날짜 이용 가능성 책 객체가 다음 코드로 설정되어 있으므로, 아직 최적화되지 않은 코드를 참고하세요:
처음에는 프로그램이 괜찮을 수 있지만, 시간이 지나면서 책의 수가 대량으로 늘어나고, 각 책마다 버전과 수량이 달라지면서 시스템이 점점 느려지는 것을 알게 될 것입니다. 메모리 속 수천 개의 책 객체를 상상할 수 있으며, 공유 모드로 최적화해야 합니다.
데이터를 내부 데이터와 외부 데이터 두 가지 유형으로 나눌 수 있으며, 책 객체(제목, 저자 등)와 관련된 데이터는 내부 속성에 귀속할 수 있고, (checkoutMember, dueReturnDate 등)은 외부 속성에 귀속할 수 있습니다. 이렇게 다음 코드는 같은 책 안에 같은 객체를 공유할 수 있는데, 누가 빌리든 같은 책이라면 기본 정보는 동일하기 때문입니다:
기본 공장을 정의하세요
책의 객체가 이전에 생성되었는지 확인하고, 생성되면 반환하며, 생성되지 않으면 다시 생성하고 저장하는 기본 공장을 정의해 보겠습니다. 이렇게 하면 각 책 유형별로 객체만 생성할 수 있습니다:
외부 상태 관리
외부 상태는 비교적 단순하지만, 우리가 캡슐화한 책을 제외하고, 나머지는 여기서 관리해야 합니다:
이렇게 하면 같은 책의 동일한 정보를 bookmanager 객체에 저장할 수 있고, 한 부만 저장할 수 있습니다; 이전 코드와 비교했을 때, 많은 메모리가 절약된 것을 알 수 있습니다.
메타 모드와 DOM을 즐기세요
여기서 DOM 버블링 사건에 대해 많이 말하지는 않겠습니다. 모두가 이미 알고 있을 거라 생각합니다. 두 가지 예를 들어보겠습니다.
예시 1: 중앙집중식 사고 관리 예를 들어, 메뉴나 ul의 여러 li 같은 유사한 요소나 구조물이 클릭 이벤트를 모니터링해야 한다면, 각 요소를 이벤트 바인딩을 위해 더 많은 요소를 바인딩해야 합니다. 만약 요소가 매우 많다면, 성능을 상상할 수 있고, 버블링 지식과 결합하면, 어떤 자식 요소에 이벤트 트리거가 있으면 트리거 후 더 높은 요소로 버블링됩니다. 이 기능을 사용하면 샹위안 모드를 사용할 수 있습니다. 이러한 유사한 요소들의 부모 요소들의 이벤트를 모니터링하고, 어떤 자식 요소가 이벤트가 트리거되었는지 결정한 후 추가 작업을 진행할 수 있습니다.
여기서는 jQuery의 bind/unbind 메서드를 예로 결합해 보겠습니다.
HTML:
JavaScript:
예시 2: 성능 향상을 위해 샹위안 모드를 적용하기
또 다른 예로, 여전히 jQuery와 관련하여, 일반적으로 이벤트의 콜백 함수에서 요소 객체를 사용합니다. 종종 $(this) 형태를 사용합니다. 사실 이 객체는 반복적으로 새로운 객체를 생성하는데, 콜백 함수 내에서 이미 DOM 요소이기 때문에 다음 코드를 사용해야 합니다:
실제로 $(this) 같은 것을 사용해야 한다면, 단일 인스턴스 패턴의 자체 버전을 구현할 수도 있습니다. 예를 들어, jQuery.signle(this) 같은 함수를 구현해 DOM 요소를 반환할 수 있습니다:
사용 방법:
이 방법은 jQuery 객체를 생성하지 않고 DOM 요소 자체를 있는 그대로 반환합니다.
요약
플라이웨이트 모드는 프로그램의 효율성과 성능을 향상시키는 모드로, 프로그램의 실행 속도를 크게 높여줍니다. 응용 분야는 다양합니다. 예를 들어, 데이터베이스에서 문자열 시리즈를 읽고 싶을 때, 그 문자열들 중 많은 수가 중복된 경우, 이 문자열들을 플라이웨이트 풀에 저장할 수 있습니다.
애플리케이션이 많은 수의 객체를 사용하고, 이 많은 객체가 많은 저장 행복을 유발한다면, 공유 모드를 고려해야 합니다; 객체의 외부 상태를 삭제하면, 상대적으로 적은 수의 공유 객체로 여러 객체 그룹을 대체할 수 있으며, 샹위안 모드를 사용하는 것도 고려할 수 있습니다.
참고 주소:http://www.addyosmani.com/resour ... ok/#detailflyweight
|
이전의:아이콘 아이콘을 찾기 위해 3개의 웹사이트를 추천합니다다음:대기 중인 메시지, 인큐된 메시지, 메시지...
|