フライ級のパターンヘンユアン
1、ハングmetapatterns
フライパターンが繰り返し最適化、遅いデータ共有および非効率的なソース溶液のカノニカル構造です。その目標の多くの関連オブジェクトが共有データにあるように、アプリケーションは、(:アプリケーションの構成、状態、などなど)のメモリ使用量を削減します。
図2に示すように、モードによってハンチントン素子
a)のデータ層
データ層、共有メモリの概念に格納されたデータに基づいて、同じオブジェクトの数が多いです。ハング員のモードは、最も時間のデータ層に適用されます。
メタスキーマハングの例:
管理に図書館システム内のすべての書籍を実装します。
重要なメタデータの各書籍:
- ID
- 見出し
- 著者
- タイプ
- 総ページ数
- 出版社のID
- ISBN
ここではそれぞれの日付だけでなく、期待リターンの日付を貸し、あなたは特定の書籍のメンバーになっているトラックを保持する必要がありますいくつかのプロパティが貸し出されています。
- ローンの日
- 貸出メンバー
- 所定の復帰時間
- 月、男女別
VARブック= 関数(ID、タイトル、著者、ジャンル、PAGECOUNT、発行者ID、ISBN、checkoutDate、checkoutMember、dueReturnDate、可用性){ この .ID = ID。 この .TITLE = タイトル; この .author = 作者。 この .genre = ジャンル。 この .pageCount = PAGECOUNT。 この .publisherID = 発行者ID; この .ISBN = ISBN; この .checkoutDate = checkoutDate。 この .checkoutMember = checkoutMember。 この .dueReturnDate =dueReturnDate; この .availability = 可用性; }。 Book.prototype = { あるgetTitle:関数(){ 戻り 、この.TITLEと、 }、 GETAUTHOR:関数(){ 戻り 、この.authorと、 }、 getISBN:関数(){ 戻り 、この.ISBNと、 } // 更新是否借出的状态 updateCheckoutStatus:関数(bookID、newStatus、checkoutDate、checkoutMember、newReturnDate){ この .ID =bookID; この .availability = newStatus。 この .checkoutDate = checkoutDate。 この .checkoutMember = checkoutMember。 この .dueReturnDate = newReturnDate。 } // 延长借出期限 extendCheckoutPeriod:関数(bookID、newReturnDate){ この .ID = bookID。 この .dueReturnDate = newReturnDate。 } // 是否逾期、返回真/偽 isPastDue:関数(bookID){ VAR CURRENTDATE = 新しいです日付(); リターン currentDate.getTime()> Date.parse(この.dueReturnDate)。 } }。
小規模なコレクションのその他の例については罰金を働くかもしれませんが、ライブラリが複数の各書籍のバージョンと利用可能なバックアップ、このような大規模なインベントリに拡張したとき、我々は時間管理システムとして通路の実行を見つけるだろうそれは遅くなります。本オブジェクトの使用数千人がメモリを圧倒して、我々は、Flyweightパターンをアップグレードすることで、当社のシステムを最適化することができます:
メタデータを組み合わせ、次の単一のエンティティブックは、特定のタイトルと本のすべてのコピーに共有されます。
// 亨元模式优化版本 VARブック= 機能(タイトル、著者、ジャンル、PAGECOUNT、発行者ID、ISBN){ この .TITLE = タイトル; この .author = 作者。 この .genre = ジャンル。 この .pageCount = PAGECOUNT。 この .publisherID = 発行者ID; この .ISBN = ISBN; }。
外部状態は削除されました。すべてのオブジェクト・データ・セグメントが存在するので、インスタンス化のために、植物を使用することができ、マネージャに移したライブラリから貸すありません。
今度は、非常に基本的な機能を定義してみましょう。、そうでない場合は新しい本の意志を - あなたは以上作成した場合、我々はそれに戻って、私たちは本のタイトルを読んで参照するには、チェックを実行することですが、以前のシステムで作成されて与えられていない仕事をするためにそれを使用します作成し、あなたがそれにアクセスできるように、保存された後。この各エッセンスのデータのみが、我々は唯一の単一のコピーを作成することが保証さは:
// ブックス植物 VAR BookFactory =(関数(){ VARの existingBooks = {}、existingBook; リターン{ createBook:機能(タイトル、著者、ジャンル,, PAGECOUNT、発行者IDについて、ISBN){ // チェック特定の書籍は、以前の要素を作成した場合データは、組み合わせ // または強制的にブール値を返します existingBook = existingBooks [ISBN]; IFは(!! existingBook){ // 現在、ダイレクトリターン場合は リターンexistingBook; } 他{ // 新しいインスタンスではない場合、私たちは本を作成してみましょうし、それが格納 VARブック= 新新ブック(タイトル、著者、ジャンル、PAGECOUNT、発行者ID、ISBN)。 existingBooks [ISBN] = 書籍; リターン・ブック。 } } }。 });
図書館ブックオブジェクトマネージャレコードに保存されているものの状態から削除:
VAR BookRecordManager =(関数(){ // 書籍データベースレコード VAR bookRecordDatabase = {}; リターン{ // ライブラリシステムに新しい本を追加 addBookRecord:機能(ID、タイトル、著者、ジャンル,, PAGECOUNT、発行者ID、ISBN、用checkoutDate、checkoutMember、dueReturnDate、dostępność){ VARブック= bookFactory.createBook(タイトル、著者、ジャンル,, PAGECOUNT、発行者ID)ISBN用; bookRecordDatabase [ID] = { checkoutMember:checkoutMember、 checkoutDate:checkoutDate、 dueReturnDate:dueReturnDate、 可用性:可用性、 書籍:予約 }。 } // 更新借出的状态 updateCheckoutStatus:関数(bookID、newStatus、checkoutDate、checkoutMember、newReturnDate){ VARのレコード= bookRecordDatabase [bookID]。 record.availability = newStatus。 record.checkoutDate = checkoutDate。 record.checkoutMember = checkoutMember。 record.dueReturnDate = newReturnDate。 } // 延长借出期限 extendCheckoutPeriod:関数(bookID、newReturnDate){ bookRecordDatabase [bookID] .dueReturnDate = newReturnDate。 } // 是否逾期 isPastDue:関数(bookID){ VAR CURRENTDATE = 新しい日付(); リターン currentDate.getTime()> Date.parse(bookRecordDatabase [bookID] .dueReturnDate)。 } }。 });
すべてのこれらの変更の結果は、現在のプロパティののBookManagerシングルトン(BookDatabase)に保存されているブックカテゴリデータから抽出された - と、私たちは、より効率的であると考えられて何かに比較することができる多数のオブジェクトを使用するために使用されます。彼らは処理するデータが内在外在的ではないため、貸出図書に関連した方法もまた、ここで設定されています。
このプロセスは少し複雑になりますが、データのパフォーマンスの問題と比較して賢明に解決されている私たちの究極の解決策を与えない、それだけで少しは我々が同じ本の30枚のコピーを持っている場合は、今、私たちは保存する必要があることを心配していましたそれは一度に十分です。各関数は、メモリを占有します。のみ(つまり、マネージャである)が存在し、そしていない一つの場所で使用するメモリを節約する上記物体の各々にこれらの機能を使用するフライ。
b)のDOM層
DOM層は、Flyweightパターンは、私たちが親コンテナの同じ動作を必要とするすべての子ノードに関連付けられているイベントハンドラを避けるために、イベント管理センターとして使用されています。