Golang에서 디자인 패턴 'Singleton'을 배웁니다.

9512 단어 5디자인 패턴GoF
GoF의 디자인 패턴을 학습하는 소재로서, 서적 「 증보 개정판 Java 언어로 배우는 디자인 패턴 입문 」가 참고가 되는 것 같네요.
다루어진 예제는 자바 기반이기 때문에 파이썬에서 동등한 사례에 도전한 적이 있었습니다.
Qiita 기사 : "Python에서 디자인 패턴 'Singleton' 배우기"

이번에는 Python으로 구현한 "Singleton"의 샘플 앱을 Golang에서 다시 구현해 보았습니다.

■ Singleton(싱글톤)



Singleton 패턴 (싱글 톤 패턴)은 객체 지향 컴퓨터 프로그램의 디자인 패턴 중 하나입니다. GoF (Gang of Four; 4명의 갱들)에 의해 정의되었다. Singleton 패턴이란, 그 클래스의 인스턴스가 1 개 밖에 생성되지 않는 것을 보증하는 디자인 패턴을 말한다. 로케일이나 룩 앤 필 등, 절대적으로 어플리케이션 전체로 통일해야 하는 구조의 구현에 사용된다

(이상 위키피디아(Wikipedia)에서 인용)

■ "Singleton" 샘플 프로그램



■ 샘플 프로그램에 대해 자세히 알아보기



Git 저장소에도 비슷한 코드가 있습니다.
htps : // 기주 b. 이 m / 싹 / s dy _ f_로 쎄 _ 펑 r r _ ぃ th _ go g / t ree / m r / shin g ton
  • 디렉토리 구성
  • .
    ├── step1
    │   └── Main.go
    └── step2
        └── Main.go
    

    인스턴스가 하나밖에 만들 수 없는 클래스를 정의해 보겠습니다.

    step1/Main.go
    package main
    
    import "fmt"
    
    // Singleton is struct
    type Singleton struct {
    }
    
    // MyClass is struct
    type MyClass struct {
        Singleton
        input int
    }
    
    var instance *MyClass
    
    func getInstance(input int) *MyClass {
        if instance == nil {
            instance = &MyClass{input: input}
        } else {
            instance.input = input
        }
        return instance
    }
    
    func main() {
        one := getInstance(1)
        fmt.Printf("one.input=%d\n", one.input)
        two := getInstance(2)
        fmt.Printf("one.input=%d, twe.input=%d\n", one.input, two.input)
        one.input = 0
        fmt.Printf("one.input=%d, twe.input=%d\n", one.input, two.input)
    }
    

    움직여 보자
    $ go run step1/Main.go 
    one.input=1
    one.input=2, twe.input=2
    one.input=0, twe.input=0
    

    글쎄, 마치 전역 변수처럼 행동합니다.

    그리고, 이쪽의 Web 기사 "Go 언어의 Singleton Pattern" 를 참고로, 조금, 구현을 수정해 보겠습니다.

    step2/Main.go
    package main
    
    import "fmt"
    
    // Singleton is struct
    type Singleton struct {
        input int
    }
    
    func (s *Singleton) getInstance(input int) *Singleton {
        s.input = input
        return s
    }
    
    // MyClass is struct
    type MyClass struct {
        Singleton
    }
    
    var myclass = &MyClass{}
    
    func main() {
        one := myclass.getInstance(1)
        fmt.Printf("one.input=%d\n", one.input)
        two := myclass.getInstance(2)
        fmt.Printf("one.input=%d, twe.input=%d\n", one.input, two.input)
        one.input = 0
        fmt.Printf("one.input=%d, twe.input=%d\n", one.input, two.input)
    }
    

    움직여 보자
    $ go run step2/Main.go
    one.input=1
    one.input=2, twe.input=2
    one.input=0, twe.input=0
    

    같은 결과가 되었습니다
    개인적으로, 이쪽의 쓰는 쪽이, 확실히 오는 느낌입니다

    ■ 참고 URL


  • 파이썬에서 디자인 패턴 'Singleton' 배우기
  • "Go 언어의 Singleton Pattern"
  • 좋은 웹페이지 즐겨찾기