美文网首页
第一部分·创建型模式-01-单例模式(Singleton)

第一部分·创建型模式-01-单例模式(Singleton)

作者: 玄德公笔记 | 来源:发表于2023-10-29 13:22 被阅读0次

1. 概述

指目标类(Class)只有一个实例对象(Object),并且向使用该对象的客户端提供访问单例的全局方法。

1.1 目的

  • 保证类只有一个实例
  • 有方法能让外部访问到该实例

1.2 实现方式

  • 懒汉式
    在第一次调用单例对象时创建该对象,这样可以避免不必要的资源浪费

  • 饿汉式
    在程序启动时就创建单例对象,这样可以提高程序的运行效率

  • 双重检查锁
    通过加锁来保证同一时刻只有一个线程可以创建单例对象

2. 代码示例

2.1 设计

以一个饿汉式模式为例

  • 定义一个单例对象king
    • 它的Get()方法为外部提供访问
  • 声明一个变量ourKing,它的类型是单例对象king
  • 定义一个函数CreateKing()用来实例化ourKing
  • 定义初始化函数,调用函数CreateKing()实例化ourKing
  • 调用
    • 使用ourKingGet()方法访问单例对象
    • 再次调用CreateKing()实例化ourKing,并访问单例对象
      • 结果没有变化,说明第二次实例化没有执行

如果使用懒汉式模式,在main()函数调用CreateKing()函数即可

2.2 代码

  • han包
package main

import (
    "fmt"
    "sync"
)

// 定义单例对象
type king struct {
    Name string
}

// 提供一个方法访问单例对象
func (k *king) Get() {
    fmt.Printf("%s is king\n", k.Name)
}

var (
    //保证后边创建函数只能执行一次
    once sync.Once
    //声明单一个变量类型是单例对象
    ourKing *king
)

func init() {
    //懒汉模式,启动时创建一个实例
    CreateKing("汉献帝")
}

// 定义一个创建单例对象的函数
func CreateKing(name string) (k *king) {
    once.Do(func() {
        ourKing = &king{
            Name: name,
        }
    })
    return ourKing
}
func main() {
    //查看该启动时实例化的单例
    ourKing.Get()
    //再次实例化,并且访问它,结果我们可以看见,没有创建新实例
    CreateKing("曹贼").Get()
}
  • 输出
献帝 is king
献帝 is king

可见SetKing第二次并没有实现。


相关文章

网友评论

      本文标题:第一部分·创建型模式-01-单例模式(Singleton)

      本文链接:https://www.haomeiwen.com/subject/hldgvdtx.html