싱글톤 디자인 패턴

王林
풀어 주다: 2024-07-18 13:46:47
원래의
872명이 탐색했습니다.

Singleton Design Pattern

싱글턴 디자인 패턴은 소프트웨어 프로그래밍에서 가장 중요하고 자주 사용되는 패턴 중 하나입니다. 이는 애플리케이션 런타임 동안 클래스에 단일 인스턴스만 있도록 보장하고 해당 인스턴스에 대한 전역 액세스 지점을 제공합니다. 이 기사에서는 Singleton의 중요성, Golang에서 구현하는 방법, 특히 동시 환경에서 싱글턴이 가져오는 이점에 대해 논의합니다.

싱글톤이란 무엇입니까?

싱글톤은 클래스의 인스턴스를 단일 인스턴스로 제한하는 디자인 패턴입니다. 이는 다음과 같이 단일 제어 지점이나 단일 공유 리소스가 필요한 상황에서 특히 유용합니다.

  • 애플리케이션 설정을 중앙 집중화해야 하는 구성 관리자
  • 제한된 수의 연결을 효율적으로 관리해야 하는 데이터베이스 연결 풀.
  • 로그 일관성이 중요한 로거.

싱글톤을 사용하는 이유는 무엇입니까?

더 이해하기 쉬운 Pattern 구현에 대한 몇 가지 사항을 나열하고 모든 것이 장밋빛인 것은 아니며 이와 관련하여 발생할 수 있는 몇 가지 문제를 보여 드리겠습니다.

장점

  • 전역 일관성: 애플리케이션의 모든 지점이 동일한 인스턴스를 사용하도록 보장하여 데이터 및 동작 일관성을 제공합니다.
  • 액세스 제어: 인스턴스 생성 및 액세스 제어를 중앙 집중화하여 객체 수명 주기의 유지 관리를 용이하게 합니다.
  • 리소스 효율성: 불필요한 다중 인스턴스 생성을 방지하여 메모리와 처리 리소스를 절약합니다.

단점

  • 테스트 난이도: 싱글톤은 관리해야 하는 전역 상태를 도입하기 때문에 단위 테스트 작성을 더 어렵게 만들 수 있습니다.
  • 결합 증가: 싱글톤을 과도하게 사용하면 구성 요소 간의 결합이 더 긴밀해져서 애플리케이션을 유지하고 발전시키기가 어려워질 수 있습니다.

싱글톤 구현

싱글톤을 구현하기 위해 Golang을 사용하겠습니다. 이 언어에서는 여러 고루틴이 동시에 인스턴스에 액세스하려고 시도하는 경우에도 하나의 인스턴스만 생성되도록 동시성에 특별한 주의를 기울여야 합니다.

우리의 예를 실제 세계에 더 가깝게 만들기 위해 애플리케이션용 Logger를 만들어 보겠습니다. 로거는 로그 일관성을 보장하기 위해 고유해야 하는 애플리케이션의 일반적인 도구입니다.

1 - 구조 정의

먼저 단일 인스턴스를 갖고 싶은 구조를 정의합니다.

package logger

import (
    "fmt"
    "sync"
)

type Logger struct {}

var loggerInstance *Logger
로그인 후 복사

2 - NewInstance 함수 구현

NewInstance 함수는 싱글톤 구조의 단일 인스턴스를 반환하는 역할을 합니다. 동시 환경에서 보안을 보장하기 위해 뮤텍스를 사용하고 효율성을 위해 이중 확인 잠금을 구현합니다.

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가 실제로 하나의 인스턴스만 실행되도록 보장하는지 테스트하려면 다음 테스트를 수행할 수 있습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!