Skip to content

简介

在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。

单例模式中的角色和职责

Singleton

在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。

代码

package main

import (
    "fmt"
    "sync"
)

var once sync.Once

type singelton struct {}

var instance *singelton

func GetInstance() *singelton {

    once.Do(func(){
        instance = new(singelton)
    })

    return instance
}

func (s *singelton) SomeThing() {
    fmt.Println("单例对象的某方法")
}

func main() {
    s := GetInstance()
    s.SomeThing()
}

总结

优点

  1. 单例模式提供了对唯一实例的受控访问。
  2. 节约系统资源。由于在系统内存中只存在一个对象

缺点

  1. 扩展略难。单例模式中没有抽象层。
  2. 单例类的职责过重。

适用场景

  1. 系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。
  2. 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例