Javascript 디자인 모드: Flyweight 모드
11637 단어 flyweightpattern
모든'flyweight'대상은 두 부분으로 나뉘는데 그것이 바로 상태 관련(외재) 부분과 상태 무관(내재) 부분이다.내부 상태(공유)는 Flyweight 객체에 저장됩니다.외부 상태는 클라이언트 대상에 의해 저장되거나 계산되며, Flyweight 동작을 호출할 때 전달됩니다.
우리의 대상에 대한 방법은 내재된 정보를 필요로 할 수도 있고, 이런 정보가 없으면 절대로 역할을 발휘할 수 없다.외부 정보는 외부에서 삭제하고 저장할 수 있다.
flyweight 도안은 어떻게 값을 저장합니까?
Flyweight 모드에서, 우리는 만들어진 대상에 대한 인용을 저장하기 위해 해시표를 사용합니다. 모든 대상은 키와 연결됩니다.해시표는 유사한 수조의 형식으로 데이터를 저장하는 키/값을 사용하는 데이터 구조로 그 중 (해시) 키는 수조의 인덱스에 대응한다.해시 테이블은 같은 키/값 기능을 제공하며 맵() 대상의 형식으로 자바스크립트에서 원본으로 만들어집니다.
현재, 클라이언트가 대상을 만들려고 할 때, 그와 관련된 키를 전달하기만 하면 된다.만약 이미 대상을 만들었다면, 우리는 이 대상에 대한 인용을 얻기만 하면, 그렇지 않으면 새 대상을 만들고, 그 인용을 클라이언트에게 되돌려줄 것이다.
예.
Flyweight는 공유를 사용하여 많은 객체를 효율적으로 지원합니다.현대 웹 브라우저는 이런 기술을 사용하여 같은 이미지를 두 번 불러오는 것을 방지한다.브라우저가 웹 페이지를 불러올 때, 웹 페이지의 모든 그림을 훑어볼 것입니다.브라우저는 인터넷에서 새 이미지를 모두 로드하고 내부 캐시에 배치합니다.이미 불러온 이미지에 대해 flyweight 대상을 만들 것입니다. 이 대상은 페이지에 위치와 같은 독특한 데이터를 가지고 있지만, 다른 모든 내용은 캐시된 대상에 인용됩니다.
Addy Osmani의'JavaScript 디자인 모델 배우기'라는 책의 한 예를 살펴보자. 이 책은 도서관의 모든 책을 하나의 시스템으로 관리하는 방법을 설명한다.
각 책의 주요 메타데이터는 다음과 같습니다.
앞날망치
let Book = function(
id,
title,
author,
genre,
pageCount,
publisherID,
ISBN,
checkoutDate,
checkoutMember,
dueReturnDate,
availability
) {
this.id = id;
this.title = title;
this.author = author;
this.genre = genre;
this.pageCount = pageCount;
this.publisherID = publisherID;
this.ISBN = ISBN;
this.checkoutDate = checkoutDate;
this.checkoutMember = checkoutMember;
this.dueReturnDate = dueReturnDate;
this.availability = availability;
};
Book.prototype = {
getTitle: function() {
return this.title;
},
getAuthor: function() {
return this.author;
},
getISBN: function() {
return this.ISBN;
},
// For brevity, other getters are not shown
updateCheckoutStatus: function(
bookID,
newStatus,
checkoutDate,
checkoutMember,
newReturnDate
) {
this.id = bookID;
this.availability = newStatus;
this.checkoutDate = checkoutDate;
this.checkoutMember = checkoutMember;
this.dueReturnDate = newReturnDate;
},
extendCheckoutPeriod: function(bookID, newReturnDate) {
this.id = bookID;
this.dueReturnDate = newReturnDate;
},
isPastDue: function(bookID) {
var currentDate = new Date();
return currentDate.getTime() > Date.parse(this.dueReturnDate);
}
};
수천 개의 도서 대상을 사용하면 대량의 사용 가능한 메모리를 차지할 수 있지만, 우리는 Flyweight 모드 최적화 시스템을 사용하여 이를 개선할 수 있다.우리는 현재 데이터를 내재와 외재의 두 가지 상태로 나눌 수 있다. 다음과 같다. 도서 대상(제목, 저자 등)과 관련된 데이터는 내재적인 것이고 서명 데이터(checkout Member,due Return Date 등)는 외재적인 것으로 여겨진다.
실제로 모든 도서의 속성 조합은 하나의 도서 대상만 필요하다는 뜻이다.이것은 여전히 상당한 수량의 물체이지만, 우리 이전보다 현저히 적다.
우리의 서원 데이터 조합의 다음 단일 실례는 특정한 제목을 가진 책의 모든 사본에서 공유될 것이다.
후추
// Flyweight optimized version
var Book = function(title, author, genre, pageCount, publisherID, ISBN) {
this.title = title;
this.author = author;
this.genre = genre;
this.pageCount = pageCount;
this.publisherID = publisherID;
this.ISBN = ISBN;
};
외부 상태가 제거되었습니다.라이브러리 서명과 관련된 모든 내용은 관리자로 옮겨지고 대상 데이터가 분할됨에 따라 공장은 실례화에 사용할 수 있다.Flyweight는 본질적으로'대상 규범화 기술'이다. 이런 기술에서 공공 속성은 공유된 Flyweight 대상으로 분해된다.(주의: 이 생각은 데이터 모델을 규범화하는 것과 유사하여 모델링자는 불필요한 것을 최소화하려고 한다).
flyweight 모드의 장점과 단점은 무엇입니까?
단점: Flyweights는 전송, 검색, 계산 외부 상태와 관련된 운행 비용을 가져올 수 있습니다. 특히 이전에 내부 상태로 저장되었을 때입니다.
이점*:
https://www.geeksforgeeks.org/flyweight-design-pattern/
https://anasshekhamis.com/2017/11/16/flyweight-design-pattern-in-javascript/
https://www.dofactory.com/javascript/design-patterns/flyweight#:~:text=Essentially%20Flyweight%20is%20an%20'object,out%20into%20shared%20flyweight%20objects.&text=An%20example%20of%20the%20Flyweight,are%20shared%20across%20the%20application .
Reference
이 문제에 관하여(Javascript 디자인 모드: Flyweight 모드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jazsmith24/javascript-design-patterns-flyweight-pattern-1g5g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)