国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ ウェブフロントエンド jsチュートリアル シングルトン設(shè)計(jì)パターン: アプリケーションでのグローバル狀態(tài)の管理

シングルトン設(shè)計(jì)パターン: アプリケーションでのグローバル狀態(tài)の管理

Dec 03, 2024 pm 07:34 PM

アプリケーションの複數(shù)の部分で共有する必要があるオブジェクト (データベース接続、WebSocket クライアント、構(gòu)成マネージャーなど) を扱っていることに気付いたことがありますか?

アプリケーションやプロセスのライフサイクル全體を通じて一貫性を保ち、アクセスできるようにするには、このようなオブジェクトをどのように管理すればよいでしょうか?ここで シングルトン デザイン パターン が登場(chǎng)します。

概要

シングルトン創(chuàng)造的なデザイン パターン であり、新しいオブジェクトを使用してオブジェクトを作成するネイティブな方法に伴うさまざまな問(wèn)題に対処するデザイン パターンのカテゴリです。 キーワードまたは演算子。

シングルトン設(shè)計(jì)パターンは、次の 2 つの主要な問(wèn)題を解決することに重點(diǎn)を置いています。

  1. インスタンスに グローバル アクセス ポイントを提供するにはどうすればよいですか?
  2. クラス または特定のタイプのオブジェクトのインスタンスが 1 つだけであることを確認(rèn)するにはどうすればよいですか?

これにより、データベース接続、WebSocket クライアント、キャッシュ サービス、またはアプリケーションのライフサイクル全體を通じてメモリ內(nèi)で永続化および変更する必要があるものなど、特定の種類(lèi)またはタイプのグローバル狀態(tài)を管理する方法が簡(jiǎn)素化および標(biāo)準(zhǔn)化されます。

シングルトン設(shè)計(jì)パターンを?qū)g裝するにはどうすればよいでしょうか?

Singleton Design Pattern: Managing Global States in Your Applications

上記のスキーマは次の TypeScript クラスに変換されます。

TypeScript の例

class Singleton {
  private static instance: Singleton
  // other properties...
  public authorName: string

  private constructor({ authorName }: { authorName: string }) {
    this.authorName = authorName
  }

  public static getInstance(params) {
    if (!this.instance) {
      this.instance = new Singleton(params)
    }
    return this.instance
  }
  // other methods...
}

  • クラスは、一意に共有可能なインスタンスを保存するための靜的プロパティを定義する必要があります。

キーワード static は、インスタンス オブジェクトがクラスのインスタンスではなく、クラス定義自體に関連付けられていることを意味します。

  • クラスのコンストラクターはプライベートとしてマークされる必要があります。クラスのインスタンスを取得する唯一の方法は、靜的メソッド getInstance を呼び出すことです。
const instance = Singleton.getInstance({ authorName: "Sidali Assoul" })


// let's imagine
const instance1 = Singleton.getInstance({ authorName: "Sidali Assoul" }) // "Sidali Assoul"
const instance2 = Singleton.getInstance({ authorName: "John Doe" }) // "Sidali Assoul"

Singleton クラスに関連付けられた靜的メソッド getInstance を呼び出すことで、上記のクラスを利用できます。

getInstance メソッドは、コードベースの異なる場(chǎng)所でクラスを複數(shù)回インスタンス化した場(chǎng)合でも、常に同じインスタンスを取得することを保証します。

Singleton Design Pattern: Managing Global States in Your Applications

したがって、両方の変數(shù) (instance1 と instance2) は同じシングルトン インスタンスを共有します。

最初の実踐的なシナリオ

Prisma は、JavaScript エコシステムでよく知られた ORM です。アプリケーションで Prisma を使用するには、PrismaClient をインポートし、そこからオブジェクトをインスタンス化する必要があります。

class Singleton {
  private static instance: Singleton
  // other properties...
  public authorName: string

  private constructor({ authorName }: { authorName: string }) {
    this.authorName = authorName
  }

  public static getInstance(params) {
    if (!this.instance) {
      this.instance = new Singleton(params)
    }
    return this.instance
  }
  // other methods...
}

Prisma クライアントは、遅延的な方法で、つまり、最初にエンティティのクエリまたは変更を試みたときにのみ、データベースに接続します。

const instance = Singleton.getInstance({ authorName: "Sidali Assoul" })


// let's imagine
const instance1 = Singleton.getInstance({ authorName: "Sidali Assoul" }) // "Sidali Assoul"
const instance2 = Singleton.getInstance({ authorName: "John Doe" }) // "Sidali Assoul"

prismaClient がファイルにインポートされるたびに、PrismaClient から新しいインスタンスが作成されます。したがって、これらのインスタンスを使用するたびに、多くのデータベース接続が確立されます。

import { PrismaClient } from "@prisma/client"

export const prismaClient = new PrismaClient()

データベースは通常、限られた數(shù)の接続しか処理できないため、多數(shù)のオープンデータベース接続はアプリケーションのパフォーマンスを低下させ、データベースのシャットダウンにつながる可能性もあります。

シングルトン デザイン パターン は、PrismaClient クラスのインスタンスが複數(shù)存在することを回避し、PrismaClientSingleton.getInstance() 靜的メソッド経由でインスタンスにアクセスするための単一ポイントを提供することで、このような問(wèn)題を防ぐのに役立ちます。

import { prismaClient } from "@/db"

const users = await prismaClient.user.findMany() // query on the users table

2 番目の実踐的なシナリオ

これから説明するもう 1 つの実際的なシナリオは、メモリ內(nèi)レート リミッター サービスです。

ユーザーやハッカーは、特定のエンドポイントに大量のリクエストを送信することで、そのエンドポイントにスパムを送信する可能性があります。これにより、脆弱性、予期せぬコスト、またはサーバー障害が発生する可能性があります。

これを防ぐために、基本的なインメモリ レート リミッター サービスを?qū)g裝できます。

サービスは、特定のタイミング ウィンドウ間隔 (たとえば、60 秒) の間、IP アドレスごとのリクエストの數(shù)を制限する必要があります。

export const prismaClient = new PrismaClient() // a new instance is created every time it gets imported then used.

RateLimiterService クラスは、指定されたタイミング ウィンドウ內(nèi)で IP アドレス (マップ キー) によって識(shí)別される特定のユーザーによって行われたリクエスト (requests[ip].count) の數(shù)を追跡するマップを保存します。 (リクエスト[ip].lastRequestTime).

私たちの RateLimiterService はグローバルに使用することを目的としています。つまり、RateLimiterService がインポートされるたびに、リクエスト マップ、リミット、ウィンドウ変數(shù)で構(gòu)成される內(nèi)部狀態(tài)値をリセットする必要はありません。

結(jié)論

シングルトン設(shè)計(jì)パターンは、アプリケーション內(nèi)の共有リソースを効果的に管理するための強(qiáng)力なツールです

重要なポイント:

  1. シングルトンは、クラスのインスタンスが 1 つだけであることを保証し、そのインスタンスへのグローバル アクセス ポイントを提供します。
  2. データベース接続、構(gòu)成設(shè)定、キャッシュなどの共有リソースの管理に役立ちます。
  3. 実際のアプリケーションには、Prisma などの ORM とのデータベース接続の最適化や、レート制限サービスの実裝が含まれます。

接觸

ご質(zhì)問(wèn)がある場(chǎng)合、またはさらに話し合いたい場(chǎng)合は、お?dú)葺Xにここからご連絡(luò)ください。

コーディングを楽しんでください!

以上がシングルトン設(shè)計(jì)パターン: アプリケーションでのグローバル狀態(tài)の管理の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫(huà)像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫(xiě)真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫(xiě)真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類(lèi)リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

node.jsでHTTPリクエストを作成する方法は? node.jsでHTTPリクエストを作成する方法は? Jul 13, 2025 am 02:18 AM

node.jsでHTTPリクエストを開(kāi)始するには、組み込みモジュール、axios、およびnode-fetchを使用する3つの一般的な方法があります。 1.依存関係のない內(nèi)蔵http/httpsモジュールを使用します。これは基本的なシナリオに適していますが、https.get()を使用してデータを取得したり、.write()を介してPOSTリクエストを送信するなど、データステッチとエラーモニタリングの手動(dòng)処理が必要です。 2.Axiosは、約束に基づいたサードパーティライブラリです。簡(jiǎn)潔な構(gòu)文と強(qiáng)力な機(jī)能を備えており、非同期/待ち聲、自動(dòng)JSON変換、インターセプターなどをサポートします。非同期リクエスト操作を簡(jiǎn)素化することをお?jiǎng)幛幛筏蓼埂?3.Node-Fetchは、約束と単純な構(gòu)文に基づいて、ブラウザフェッチに似たスタイルを提供します

JavaScriptデータ型:プリミティブ対參照 JavaScriptデータ型:プリミティブ対參照 Jul 13, 2025 am 02:43 AM

JavaScriptデータ型は、プリミティブタイプと參照タイプに分割されます。プリミティブタイプには、文字列、數(shù)字、ブール、ヌル、未定義、シンボルが含まれます。値は不変であり、コピーは値を割り當(dāng)てるときにコピーされるため、互いに影響を與えません。オブジェクト、配列、関數(shù)などの參照タイプはメモリアドレスを保存し、同じオブジェクトを指す変數(shù)は互いに影響します。 TypeofとInstanceOFを使用してタイプを決定できますが、TypeOfNullの歴史的な問(wèn)題に注意してください。これらの2種類(lèi)の違いを理解することは、より安定した信頼性の高いコードを書(shū)くのに役立ちます。

JavaScript Timeオブジェクト、誰(shuí)かがEACTEXE、Google Chromeなどのより高速なWebサイトを構(gòu)築します。 JavaScript Timeオブジェクト、誰(shuí)かがEACTEXE、Google Chromeなどのより高速なWebサイトを構(gòu)築します。 Jul 08, 2025 pm 02:27 PM

こんにちは、JavaScript開(kāi)発者!今週のJavaScriptニュースへようこそ!今週は、DenoとのOracleの商標(biāo)紛爭(zhēng)、新しいJavaScript Timeオブジェクトがブラウザ、Google Chromeアップデート、およびいくつかの強(qiáng)力な開(kāi)発ツールによってサポートされています。始めましょう! 「JavaScript」の商標(biāo)を登録しようとするDeno Oracleの試みとのOracleの商標(biāo)紛爭(zhēng)は、論爭(zhēng)を引き起こしました。 Node.jsとDenoの作成者であるRyan Dahlは、商標(biāo)をキャンセルするために請(qǐng)願(yuàn)書(shū)を提出しました。

ハンドリングの約束:javascriptのチェーン、エラー処理、および約束の組み合わせ ハンドリングの約束:javascriptのチェーン、エラー処理、および約束の組み合わせ Jul 08, 2025 am 02:40 AM

約束は、JavaScriptで非同期操作を処理するためのコアメカニズムです。チェーンコール、エラー処理、コンビナーの理解は、アプリケーションをマスターするための鍵です。 1.チェーンコールは、.then()を通じて新しい約束を返し、非同期プロセスの連結(jié)を?qū)g現(xiàn)します。それぞれ.then()は以前の結(jié)果を受け取り、値または約束を返すことができます。 2。エラー処理は、.catch()を使用して例外をキャッチしてサイレント障害を回避し、キャッチのデフォルト値を返すためにプロセスを継続する必要があります。 3。promise.all()などの組み合わせ(すべての成功後にのみ成功しました)、promise.race()(最初の完了が返されます)、promise.allsettled()(すべての完了を待っています)

キャッシュAPIとは何ですか?また、サービスワーカーでどのように使用されますか? キャッシュAPIとは何ですか?また、サービスワーカーでどのように使用されますか? Jul 08, 2025 am 02:43 AM

Cacheapiは、ブラウザからネットワークリクエストをキャッシュするツールです。これは、ウェブサイトのパフォーマンスとオフラインエクスペリエンスを改善するために、サービスワーカーと併用することがよくあります。 1.開(kāi)発者は、スクリプト、スタイルシート、寫(xiě)真などのリソースを手動(dòng)で保存できるようにします。 2。要求に応じてキャッシュ応答と一致させることができます。 3.特定のキャッシュの削除またはキャッシュ全體のクリアをサポートします。 4.フェッチイベントを聞いているサービスワーカーを介して、キャッシュの優(yōu)先順位またはネットワークの優(yōu)先戦略を?qū)g裝できます。 5.オフラインサポート、繰り返しのアクセス速度の高速化、主要なリソースのプリロード、バックグラウンドアップデートコンテンツによく使用されます。 6.それを使用する場(chǎng)合、キャッシュバージョンの制御、ストレージ制限、およびHTTPキャッシングメカニズムとの違いに注意する必要があります。

JSラウンドアップ:JavaScriptイベントループに深く潛り込む JSラウンドアップ:JavaScriptイベントループに深く潛り込む Jul 08, 2025 am 02:24 AM

JavaScriptのイベントループは、コールスタック、WebAPIS、およびタスクキューを調(diào)整することにより、非同期操作を管理します。 1.コールスタックは同期コードを?qū)g行し、非同期タスクに遭遇すると、処理のためにWebAPIに引き渡されます。 2。WebAPIがバックグラウンドでタスクを完了した後、コールバックを?qū)潖辘工毳濠`(マクロタスクまたはマイクロタスク)に入れます。 3.イベントループは、コールスタックが空であるかどうかをチェックします??栅螆?chǎng)合、コールバックはキューから取り出され、実行のためにコールスタックに押し込まれます。 4.マイクロタスク(Promise.thenなど)は、マクロタスク(SettimeOutなど)より優(yōu)先されます。 5.イベントループを理解するには、メインスレッドのブロックを避け、コード実行順序を最適化するのに役立ちます。

JavaScript DOMイベントでのイベントの泡立ちとキャプチャの理解 JavaScript DOMイベントでのイベントの泡立ちとキャプチャの理解 Jul 08, 2025 am 02:36 AM

イベントの泡は、ターゲット要素から祖先ノードに外側(cè)に伝播し、イベントキャプチャは外側(cè)の層からターゲット要素に內(nèi)側(cè)に伝播します。 1。イベントバブル:子要素をクリックした後、イベントは親要素のリスナーを上向きにトリガーします。たとえば、ボタンをクリックした後、最初に保育を出してから、親クリックしました。 2。イベントキャプチャ:3番目のパラメーターをtrueに設(shè)定して、リスナーが[親子要素のキャプチャリスナー]をクリックする前に[親要素のキャプチャリスナーをトリガーするなど、キャプチャステージで実行されるようにします。 3.実用的な用途には、子どもの要素イベントの統(tǒng)一された管理、傍受前処理、パフォーマンスの最適化が含まれます。 4. DOMイベントストリームは、キャプチャ、ターゲット、バブルの3つの段階に分割され、デフォルトのリスナーはバブルステージで実行されます。

マップとフィルターを超えて高次関數(shù)のJSラウンドアップ マップとフィルターを超えて高次関數(shù)のJSラウンドアップ Jul 10, 2025 am 11:41 AM

JavaScriptアレイには、Map and Filterに加えて、他の強(qiáng)力で使用されていない方法があります。 1.還元は、合計(jì)するだけでなく、カウント、グループ、フラットンアレイ、新しい構(gòu)造を構(gòu)築することもできます。 2。FindおよびFindIndexは、個(gè)々の要素またはインデックスを見(jiàn)つけるために使用されます。 3.一部とすべてが條件が存在するか、すべての出會(huì)いかを判斷するために使用されます。 4.ソートはソートできますが、元の配列を変更します。 5.副作用を避けるために、それを使用するときにアレイをコピーすることに注意してください。これらの方法により、コードがより簡(jiǎn)潔で効率的になります。

See all articles