JavaScriptでは、ブラウザ、特にモバイルデバイスのブラウザが非常に限られたメモリを割り当て、メモリを保存する方法は非常に意味のあるものになりました。メモリを保存する効果的な方法は、オブジェクトの数を減らすことです。
フライ級モード(フライ級)は、共有テクノロジーを実行して、多数の微調整されたオブジェクトを効果的にサポートし、同じコンテンツ(メモリ消費など)を持つ多数の小さなクラスのオーバーヘッドを回避し、全員がクラスを共有できるようにします(メタクラス)。
百科事典パターンは、非常に類似したクラスの大量のオーバーヘッドを回避できます。プログラミングでは、データを表現するために多数の細粒クラスインスタンスを作成する必要がある場合があります。これらのインスタンスがいくつかのパラメーターを除いて基本的に同じオーバーヘッドを持っていることがわかった場合、インスタンス化する必要があるクラスの数を大幅に減らすことができます。これらのパラメーターをクラスインスタンスの外側に移動し、メソッドが呼び出されたときにそれらを渡すことができる場合、共有することで個々のインスタンスの数を大幅に削減できます。
JavaScriptに百科事典モードを適用するには、2つの方法があります。 1つ目は、主にメモリ内の多数の同様のオブジェクトにデータレイヤーに適用することです。 2つ目は、DOMレイヤーに適用することです。百科事典を中央イベントマネージャーに使用して、親コンテナの各子要素にイベントハンドルを追加しないようにすることができます。
フライウェイトには2つの重要な概念があります。内部状態内因性および外部状態外因性です。内部状態はオブジェクト内の内部メソッドを介して管理され、外部情報は削除または外部から保存できます。
率直に言って、最初に元のモデルをつまんでから、さまざまな機会や環境に応じて異なる特性を持つ特定のモデルを作成することです。明らかに、ここでは異なる新しいオブジェクトを生成する必要があるため、工場モードはフライ級モードでしばしば表示されます。フライ級の内部状態は共有に使用されます。 Flyweight Factoryは、フライ級プール(モードプール)を維持して、内部状態のオブジェクトを保存する責任があります。
すべてのオブジェクトを同じ内部状態で同じ共有オブジェクトに置き換え、そのような共有オブジェクトを作成するには、通常のコンストラクターではなくシングルトン工場の方法が必要です。これにより、インスタンス化された個々のオブジェクトを追跡できるため、必要なオブジェクトの内部状態が既存のオブジェクトとは異なる場合にのみ、新しいオブジェクトが作成されます。オブジェクトの外部状態は、マネージャーオブジェクトに保存されます。オブジェクトのメソッドを呼び出すと、マネージャーはこれらの外部状態をパラメーターとして渡します。
オブジェクトのデータを2つの異なるオブジェクト(共有オブジェクト、マネージャーオブジェクト)に保存します
1。共有オブジェクト(元のオブジェクトをお楽しみください)
2。シングルトン工場メソッド(共有オブジェクトを作成)
3.マネージャーオブジェクト(外部状態を管理)
たとえば、ライブラリの本は、多くの属性を持つオブジェクトで表すことができます。
var book = function(id、title、著者、ジャンル、pagecount、publisherid、isbn、checkoutdate、checkoutmember、duereturndate、availability){... // initialization code} book.prototype = {gettitle:function(){return this.title; }、... //貸出ステータスメソッドの更新updatecheckoutstatus:function(bookid、newstatus、checkoutdate、checkoutmember、newreturndate){...}、// // ending extendcheckoutperiod:function(bookid、newreturndate){...}、//プログラムは最初は問題ないかもしれませんが、時間が経つにつれて、本は大量に増加する可能性があり、各タイプの本には異なるバージョンと量があり、システムが遅くなり、遅くなっていることがわかります。何千もの本のオブジェクトがメモリ内で想像でき、百科事典モードを使用して最適化する必要があります。
データを2種類のデータに分割できます。同じ本では、本のオブジェクト(タイトル、著者など)に関連するデータは内部プロパティに起因する可能性がありますが、(CheckOutMember、DuereturnDateなど)は外部プロパティに起因する可能性があります。このようにして、次のコードは同じ本で同じオブジェクトを共有できます。なぜなら、本が同じ本である限り、本を借りている人に関係なく、基本情報は同じです。
//共有オブジェクトvar book = function(title、著者、ジャンル、pagecount、publisherid、isbn){this.title = title; this.author =著者; this.genre = genre; this.pagecount = pagecount; this.publisherid = publisherid; this.isbn = isbn;};本のオブジェクトが以前に作成されたかどうかを確認するための基本的な工場を定義し、後でアクセスし続けることができるように、本がある場合は返品し、再作成して保存します。
/* Factory Singleton*/var bookfactory =(function(){var expstincebooks = {}; return {createbook:function(title、著者、ジャンル、pagecount、publisherid、isbn){/*以前に作成するかどうかを見つける*/var既存の本=既存の本=既存の本[isbn];著者、PageCount、ISBN);外部状態は比較的単純です。私たちがカプセル化した本を除いて、他のすべてはここで管理する必要があります:
/*bookrecordmanager singleton for for for for for for management*/var bookrecordmanager =(function(){var bookrecorddatabase = {}; return {/*借入記録を追加*/addbookecord:function(id、pagecount、publisherid、isbn、checkoutdate、duereturndate、bookurndate、checkoutdate、urtundate、checkoutdate bookfactory.createbook(著者、ジャンル、パブリッド、ISBN); Checkoutment、newreturndate = bookorddatabase [bookid]; Book RecordDataBase [BookID] .DuereturnDate;このようにして、同じ本の同じ情報をBookManagerオブジェクトに保存し、1つのコピーのみを保存しました。以前のコードと比較して、多くのメモリを保存することがわかります。
オブジェクトプール
オブジェクトプールは別のパフォーマンス最適化ソリューションであり、Xiangyuanモードといくつかの類似点がありますが、内部状態と外部状態を分離しません。
一般的なオブジェクトプールの実装:
var objectpoolfactory = function(createobjfn){var objectpool = []; //オブジェクトプールreturn {create:function(){// var obj = objectpool.length === 0を取得しますか? createobjfn.apply(this、arguments):objectpool.shift(); OBJを返します。 }、回復:function(obj){// objectpool.push(obj); }}};ここで、ObjectPoolFactoryを使用して、IFRAMEをロードするオブジェクトプールを作成します。
var iframeFactory = objectPoolFactory(function(){var iframe = document.createelement( 'iframe'); document.body.appendChild(iframe); iframe.onload = function = function = null; // iframeのロードのバグを防ぐiframeファクトリー(iframe); iframeを返します;}); // var iframe1 = iframefactory.create()を呼び出すiframe1.src = 'http://www.qq.com';参照:「JavaScriptパターン」「JavaScriptのデザインパターンと開発の実践」
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。