シングルトン設計パターンは、ソフトウェア プログラミングで最も重要で頻繁に使用されるパターンの 1 つです。これにより、アプリケーションの実行時にクラスにインスタンスが 1 つだけ存在することが保証され、そのインスタンスへのグローバル アクセス ポイントが提供されます。この記事では、シングルトンの重要性、Golang でのシングルトンの実装方法、特に同時環境においてシングルトンがもたらす利点について説明します。
シングルトンは、クラスのインスタンスを単一のインスタンスに制限する設計パターンです。これは、次のような単一の制御点または単一の共有リソースが必要な状況で特に役立ちます。
利点
この例を現実の世界に近づけるために、アプリケーションのロガーを作成してみましょう。ロガーはアプリケーションの一般的なツールであり、ログの一貫性を確保するために固有である必要があります。
1 - 構造の定義
package logger import ( "fmt" "sync" ) type Logger struct {} var loggerInstance *Logger
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 }
それでは、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) }
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
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
これが Golang のシングルトンをより深く理解するのに役立つことを願っています。
以上がシングルトン設計パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。