シングルトン設計パターン

王林
リリース: 2024-07-18 13:46:47
オリジナル
757 人が閲覧しました

Singleton Design Pattern

シングルトン設計パターンは、ソフトウェア プログラミングで最も重要で頻繁に使用されるパターンの 1 つです。これにより、アプリケーションの実行時にクラスにインスタンスが 1 つだけ存在することが保証され、そのインスタンスへのグローバル アクセス ポイントが提供されます。この記事では、シングルトンの重要性、Golang でのシングルトンの実装方法、特に同時環境においてシングルトンがもたらす利点について説明します。

シングルトンとは何ですか?

シングルトンは、クラスのインスタンスを単一のインスタンスに制限する設計パターンです。これは、次のような単一の制御点または単一の共有リソースが必要な状況で特に役立ちます。

    構成マネージャー。アプリケーション設定を一元管理する必要があります。
  • データベース接続プール。限られた数の接続を効率的に管理する必要があります。
  • ロガー。ログの一貫性が重要です。
シングルトンを使用する理由

パターンからの実装について、より意味のあるいくつかのポイントをリストします。また、すべてがバラ色であるわけではなく、それによって発生する可能性のある問題のいくつかを示すつもりです。

利点

    グローバルな一貫性: アプリケーションのすべてのポイントが同じインスタンスを使用することを保証し、データと動作の一貫性を提供します。
  • アクセス制御: インスタンスの作成とアクセスを一元管理し、オブジェクトのライフサイクルのメンテナンスと管理を容易にします。
  • リソース効率: 複数のインスタンスの不必要な作成を回避し、メモリと処理リソースを節約します。
短所

    テストの難易度: シングルトンでは管理が必要なグローバル状態が導入されるため、単体テストの作成がより困難になる可能性があります。
  • 結合の増加: シングルトンを過度に使用すると、コンポーネント間の結合が強化され、アプリケーションの維持と進化が困難になる可能性があります。
シングルトンの実装

シングルトンを実装するには Golang を使用します。この言語では、複数のゴルーチンが同時にインスタンスにアクセスしようとする場合でも、インスタンスが 1 つだけ作成されるようにするために、同時実行性に特別な注意を払う必要があります。

この例を現実の世界に近づけるために、アプリケーションのロガーを作成してみましょう。ロガーはアプリケーションの一般的なツールであり、ログの一貫性を確保するために固有である必要があります。

1 - 構造の定義

まず、単一のインスタンスを持つ構造を定義します。


package logger

import (
    "fmt"
    "sync"
)

type Logger struct {}

var loggerInstance *Logger
ログイン後にコピー
2 - NewInstance 関数の実装

NewInstance 関数は、Singleton 構造体の単一インスタンスを返す役割を果たします。同時環境でのセキュリティを確保するためにミューテックスを使用し、効率性を高めるために二重チェックのロックを実装します。


package logger

import (
    "fmt"
    "sync"
)

type Logger struct{}

var logger *Logger
var mtx = &sync.Mutex{}

func NewInstance() *Logger {
    if logger == nil {
        mtx.Lock()
        defer mtx.Unlock()
        if logger == nil {
            fmt.Println("Creating new Logger")
            logger = &Logger{}
        }
    } else {
        fmt.Println("Logger already created")
    }
    return logger
}
ログイン後にコピー
3 - ログタイプの実装

ログ ツールには、情報のみを表示する Info、エラーを表示する Error など、常にいくつかのログ タイプがあります。これは、アプリケーションに表示したい情報の種類をフィルターする方法でもあります。

それでは、Info タイプのログを表示するメソッドを作成しましょう。これを行うには、ログ メッセージを受信し、それを INFO 形式にフォーマットする関数を作成します。


package logger

import (
    "fmt"
    "sync"
    "time"
)

const (
    INFO    string = "INFO"
)

type Logger struct{}

var logger *Logger
var mtx = &sync.Mutex{}

func NewInstance() *Logger {
    if logger == nil {
        mtx.Lock()
        defer mtx.Unlock()
        if logger == nil {
            fmt.Println("Creating new logger")
            logger = &Logger{}
        }
    } else {
        fmt.Println("Logger already created")
    }
    return logger
}

func (l *Logger) Info(message string) {
    fmt.Printf("%s - %s: %s\n", time.Now().UTC().Format(time.RFC3339Nano), INFO, message)
}
ログイン後にコピー
4 - ロガーの使用

そして、新しいロガーを使用するには、メインパッケージ内でロガーをインスタンス化し、ログを作成して、この実装がどのように機能するかを確認します。


package main

import (
    "playground-go/pkg/logger"
)

func main() {
    log := logger.NewInstance()
    log.Info("This is an example of log")
}
ログイン後にコピー
これはプログラムを実行したときの結果です:


Creating new logger
2024-07-03T19:34:57.609599Z - INFO: This is an example of log
ログイン後にコピー
NewInstance がインスタンスを 1 つだけ実行することを本当に保証しているかどうかをテストしたい場合は、次のテストを実行できます。


package main

import (
    "fmt"
    "playground-go/pkg/logger"
)

func main() {
    log := logger.NewInstance()
    log.Info("This is an example of log")

    log2 := logger.NewInstance()
    log2.Info("This is another example of log")

    if log == log2 {
        fmt.Println("same instance")
    } else {
        fmt.Println("different instance")
    }
}

ログイン後にコピー
ログが変更され、新しいインスタンスの作成がブロックされたことがわかります。


Creating new logger
2024-07-03T19:45:19.603783Z - INFO: This is an example of log
Logger already created
2024-07-03T19:45:19.603793Z - INFO: This is another example of log
same instance
ログイン後にコピー
結論

シングルトン パターンは、アプリケーションの実行時に特定のクラスのインスタンスが 1 つだけ存在することを保証するための強力なツールです。ロガーの例では、このパターンを適用してアプリケーション全体でログの一貫性を確保する方法を確認しました。

これが Golang のシングルトンをより深く理解するのに役立つことを願っています。

以上がシングルトン設計パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!