《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton)

这篇具有很好参考价值的文章主要介绍了《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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第二次并没有实现。


《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton),架构设计,golang,设计模式,单例模式,架构师,GO语言,饿汉模式,懒汉模式文章来源地址https://www.toymoban.com/news/detail-620989.html

到了这里,关于《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 模拟第一部分5

    1、如果想要在外部包中使用全局变量,则全局变量必须( ) 正确答案:A A、首字母必须大写 B、首字母必须小写 C、必须加上const D、必须加上var 答案解析:在函数体外声明的变量称之为全局变量。全局变量声明必须以 var 开头,如果想要在外部包中使用

    2024年02月08日
    浏览(46)
  • 第一部分:核心容器

    Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!         什么是IoC、IoC容器、bean、DI ? IoC:对象创建控制权由程序转移到IoC容器的控制反转思想。 IoC容器:创建管理对象的容器。 bean:IoC容器中被创建管理的对象。 DI:IoC容器中建立bean之间依赖关

    2024年02月13日
    浏览(44)
  • 6.播放音频(第一部分)

    这一章将对播放音频的具体内容做讲解。我的想法是按照tinyalsa中的例子作为讲解的范本,因为tinyalsa足够简单,很多时候都忽略了它的细节。趁着这个机会再整理一下tinyalsa的内容。我使用的tinyalsa从https://github.com/tinyalsa/tinyalsa下载,从examples/writei.c开始。 其中函数read_file从

    2023年04月08日
    浏览(37)
  • MySQL学习-第一部分

    MySQL数据库 MySQL是一个**关系型数据库管理系统****,**由瑞典[MySQL AB](https://baike.baidu.com/item/MySQL AB/2620844) 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用

    2024年02月15日
    浏览(50)
  • 第一部分:Spark基础篇

    第一部分:Spark基础篇_奔跑者-辉的博客-CSDN博客 第二部分:Spark进阶篇_奔跑者-辉的博客-CSDN博客 第三部分:Spark调优篇_奔跑者-辉的博客-CSDN博客 第一部分:Flink基础篇_奔跑者-辉的博客-CSDN博客 (*建议收藏*) 实时数仓之 Kappa 架构与 Lambda 架构_奔跑者-辉的博客-CSDN博客(*建议收

    2024年02月05日
    浏览(47)
  • 第一部分-基础篇-第一章:PSTN与VOIP(下篇)

      学习资料来源《FreeSWITCH权威指南》-作者杜金房这本书。我是2022年6月毕业的,偶然的机会接触到FreeSWITCH,但是目前在南京从事java后端开发,FreeSWITCH纯属个人爱好,进行笔记整理。也一直希望有机会可以参与FreeSWITCH相关工作开发,如有需要,请联系我18956043585,先说声谢

    2024年02月06日
    浏览(54)
  • HTML学习 第一部分(前端学习)

    参考学习网站: 网页简介 (w3schools.com) 我的学习思路是:网站+实践+视频。 视频很重要的,因为它会给你一种开阔思路的方式。你会想,噢!原来还可以这样。这是书本或者网站教程 所不能教给你的。而且,对一些教程,它的用法你可能 在工作或者以后都用不上,这种情况下

    2024年02月15日
    浏览(48)
  • Mysql入门基础教程(第一部分)

    MySQL基础教程解释了一些基本的SQL语句。如果这是您第一次使用关系数据库管理系统,本教程将为您提供使用MySQL数据库服务器所需的一切,例如查询数据,更新数据,管理数据库和创建表。 如果您已经熟悉其他关系数据库管理系统(如PostgreSQL,Oracle或Microsoft SQL Server等),

    2024年04月14日
    浏览(37)
  • 字符串---第一部分 序列、字串;上升,公共

    第一部分 最长上升子序列,最长上升子串,最长公共子序列,最长公共子串--dp 第二部分 KMP,trie,双指针 第三部分 待定 动态规划:审题,状态确定,状态转移,边界条件 线性DP 最长上升子序列 403 线性DP 最长上升子序列【动态规划】_哔哩哔哩_bilibili 给定一个无序整数数组

    2024年02月07日
    浏览(49)
  • 学成在线项目开发技巧整理---第一部分

    视频项目链接: 学成在线 整理的是我个人认为偏生疏的知识点,不一定涉及的全面。 在系统中某些选项是几个特定的值的一个或多个,并且随着还可以动态添加。比如支付方式,配送方式等。 此时我们应该设计一个数据字典模块,在后台进行管理,然后前台要从后端查询。并

    2023年04月22日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包