golang创建式设计模式------单例模式

news2024/11/23 20:51:50

目录导航

      • 1.单例模式
        • 1)什么是单例模式
      • 2)使用场景
      • 3)实现方式
        • 1.懒汉式单例模式
        • 2.饿汉式
        • 3.双重检查式
        • 4.`sysc.Once`式
      • 4)实践案例
      • 5)优缺点分析

1.单例模式

1)什么是单例模式

单例模式(Singleton Pattern)是一种常用的设计模式。单例模式的类提供了一种访问其唯一对象的方法,该对象可以直接访问,无须实例化。单例模式保证了一个类的对象只存在一个,同时维护一个对其对象的全局访问点。

uml类图:

在这里插入图片描述

2)使用场景

  • 如果开发者想要更加严格地控制全局变量,则可以使用单例模式。单例模式可以保证一个类只存在一个实例。除了单例模式外,无法通过其他方式替换缓存的实例
  • 如果程序中的某个类对于所有客户端都只有一个可用的实例,则可以使用单例模式。在单例模式中,如果对象已经被创建,则返回已有的对象
  • 在设计数据库连接池时,可以使用单例模式。在数据库管理系统中使用数据库连接池,主要目的是节省打开或关闭数据库连接引起的效率损耗。这种效率上的损耗还是非常巨大的,如果使用单例模式来进行维护的话,则可以大大减少这中类似的损耗。

3)实现方式

在golang中,单例模式的实现方式有4中,分别是懒汉式、饿汉式、双重检查式、和sysnc.Once。而这四种单例模式都有一个共同的特征:只实例化一次,只允许一个实例存在。

1.懒汉式单例模式

懒汉式单例模式指的是在创建对象时,不直接创建对象,在加载配置文件时才创建对象。

package typesofSigton

import "sync"

type singleton struct{
	value int
}
//声明私有指令
var instance *singleton
//加锁的目的是保证协成并发安全
//mo1.声明锁对象
var mutex sync.Mutex
//获取单例对象
func GetInstance() *singleton {
	//加锁,保证协成安全
	mutex.Lock()
	defer mutex.Unlock()
	if instance==nil{
		instance=new (singleton)
	}
	return instance
}

以上代码通过加锁的方式保证了协成的并发安全但是代码有一个问题就是每次调用该方法都需要进行加锁的操作,在性能上则不够高效。

2.饿汉式

饿汉式是指,在创建对象时,不判断创建的对象是否为空,直接创建对象。饿汉式是并发安全的,其唯一的缺点是在导入包的同时会创建对象,并且创建的对象会持续存储于内存当中。饿汉式单例模式可以使用初始化init()函数实现

package typesofSigton

import "fmt"

//var instance *singleton
func init(){
	if instance==nil{
		instance=new(singleton)
		fmt.Println("创建单个实例")
	}
}

//编写提供实力的函数
func GetInstance() *singleton {
	return instance
}

3.双重检查式

在懒汉式的基础上进行优化,减少加锁的操作,这样可以在保证并发安全的同时不影响性能,这种模式也被称为双重检查单例模式

package typesofSigton

import (
	"fmt"
	"sync"
)
//声明锁对象
var mutex sync.Mutex
//当对象为空时,对对象进行加锁操作;在创建好对象后,在获取对象时就不用加锁了
func GetIntance() *singleton{
	if instance ==nil{
		mutex.Lock()
			if instance==nil{
				instance=new(singleton)
				fmt.Println("创建单个实例")
			}
			mutex.Unlock()
	}
	return instance
}

4.sysc.Once

sysc.Once是go标准库提供的使函数只执行一次的实现,通常应用于单例模式,如初始化配置、保持数据库连接等。其作用与init()函数类似,但有区别。init()函数会在其所在的包首次被加载时执行,如果被加载的包不立即被使用,那么既浪费了内存空间,又延长了程序加载时间。

sysc.Once可以在代码的任意位置被初始化和调用,在并发场景中是并发安全的,使用sysc.Once对象的Do()方法创建实例,可以确保创建对象的方法只被执行一次

package typesofSigton

import (
	"fmt"
	"sync"
)
var once sync.Once
func GetIntance() *singleton{
	once.Do(func() {
		instance=new(singleton)
		fmt.Println("创建单个实例")
	})
	return instance
}

4)实践案例

excample.go

package excample

import (
	"fmt"
	"sync"
)

var lock = &sync.Mutex{}

type singleton struct {
}

var instance *singleton

// 获取实例对象
func GetInstance() *singleton {
	if instance == nil {
		lock.Lock()
		defer lock.Unlock()
		if instance == nil {
			fmt.Println("创建单个实例")
			instance = new(singleton)
		} else {
			fmt.Println("已创建单个实例")
		}
	} else {
		fmt.Println("已创建单个实例")
	}
	return instance
}

main.go

package main

import (
	"Signton/excample"
	"fmt"
)

func main() {
	for i := 0; i < 3; i++ {
		go excample.GetInstance()
	}
	fmt.Scanln()
}

//运行结果为
//创建单个实例
//已创建单个实例
//已创建单个实例

5)优缺点分析

优点:

  • 单例模式可以扩展为工厂模式。
  • 由于系统的内存中只存在一个对象,因此对于需要频繁创建和销毁对象的系统,使用单例模式可以提升系统的性能

缺点:

  • 由于单例模式不是抽象的,因此其扩展性较低
  • 滥用单例模式会产生一些负面问题。例如,为了节省资源,如果使用单例模式设计数据连接池对象,则可能会导致共享连接池对象过多且没有被释放的场景,从而出现连接池溢出的问题。此外,如果实例化的对象长时间不被使用,那么他可能会被操作系统认为是垃圾对象而回收,从而导致对象缺失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1672410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客小白月赛90VP

1&#xff0c;签到&#xff1a;https://ac.nowcoder.com/acm/contest/78306/A AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int n,m,a[100010]; long long sum; int main() {cin>>n>>m;for(int i1;i<n;i) cin>>a[i];for(int …

[Algorithm][回溯][全排列][子集] + 回溯原理 详细讲解

目录 0.原理讲解1.全排列1.题目链接2.算法原理详解3.代码实现 2.子集1.题目链接2.算法原理详解3.代码实现 0.原理讲解 回溯算法通常⽤于解决组合问题、排列问题和搜索问题等回溯算法的基本思想&#xff1a; 从⼀个初始状态开始&#xff0c;按照⼀定的规则向前搜索&#xff0c;…

针对关键 PuTTY 私钥恢复漏洞的 PoC 发布

安全研究人员针对广泛使用的 PuTTY SSH 和 Telnet 客户端中的一个关键漏洞发布了概念验证 (PoC) 漏洞利用。 该漏洞CVE-2024-31497允许攻击者恢复 PuTTY 版本 0.68 至 0.80 中使用 NIST P-521 椭圆曲线生成的私钥。 该漏洞源于 PuTTY在使用 P-521 曲线时偏向生成ECDSA随机数。…

[FSCTF 2023]ez_php1

一共有三小关 第一关&#xff1a;md5加密 第二关&#xff1a;反序列化 重点 单个字符串序列化 unserialize($str) "$KEY" <?php $KEY"YES I love";echo serialize($KEY); s:10:"YES I love"; 第三关&#xff1a; 反序列化 把a的地址赋给…

【linux-IMX6ULL-RTC-IIC-SPI配置思路】

目录 1. RTC简介1.1 IMX6ULL中的RTC1.2 SNVS_LP中的SRTC配置流程1.3 程序实现 2. IIC通信协议2.1 IIC基础2.2 IIC通信协议2.2.1 IIC写时序2.2.2 IIC读时序 3. IIC通信的硬件框图及配置流程3.1 IMX6ULL的硬件IIC框图3.1 IIC配置流程3.2 硬件IIC代码实现 4. SPI通信4.1 SPI通信基…

在云计算与人工智能中,7ECloud扮演着什么样的角色

数据驱动的时代&#xff0c;云计算和人工智能已成为推动现代科技进步的两大引擎。作为一家专注于云计算的公司&#xff0c;7ECloud正是在这个领域发挥自己的力量&#xff0c;力图为企业提供一站式解决方案&#xff0c;并拥有来自厂家的源头支持&#xff0c;用极其低的价格助力企…

思源笔记如何结合群晖WebDav实现云同步数据

文章目录 1. 开启群晖WebDav 服务2. 本地局域网IP同步测试3. 群晖安装Cpolar4. 配置远程同步地址5. 笔记远程同步测试6. 固定公网地址7. 配置固定远程同步地址 在数字化时代&#xff0c;信息的同步与共享变得尤为重要。无论是个人用户还是企业团队&#xff0c;都渴望能够实现跨…

【Django学习笔记(九)】Flask + MySQL的结合案例

Flask MySQL结合案例 前言正文案例1&#xff1a;添加用户1.1 浏览器发送请求&#xff0c;返回页面main.pyhtml页面 1.2 新增用户并连接数据库main.pyhtml页面 案例2&#xff1a;查询所有用户2.1 main.py2.2 html2.3 bootstrap优化html 前言 在本文中&#xff0c;介绍如何将 F…

2023 PWNHUB 3月赛-【tototo】

文章目录 volatile泄露_environ打栈漏洞利用malloc和calloc思路&#xff08;打_environ&#xff09;代码 volatile int volatile vInt; 当要求使用 volatile 声明的变量值的时候&#xff0c;系统总是重新从它所在的内存读取数据&#xff0c;即使它前面的指令刚刚从该处读取过数…

01基础篇

1、初识 JVM 1.1 什么是 JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步骤&#xff1a; 编写Java源代码文件。使用…

CentOS使用Docker搭建Nacos结合内网穿透实现无公网IP远程登录本地管理平台

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Nacos Nacos是阿里开放的一款中间件,也是一款服务注册中心&#xff0c;它主要提供三种功能&#xff1a;持久化…

Prompt Engineering ,Fine-tuning , RAG ?

Prompt Engineering ,Fine-tuning , RAG 总结&#xff1a;1 prompt engineering2 RAG (Retrieval Augmented Generation)**RAG特点****RAG优势****RAG劣势** 3 微调&#xff08;Fine-tuning&#xff09;**微调特点****微调优势****微调劣势** 4 三者共性和区别5 RAG和微调的适应…

Qt-FFmpeg开发-打开摄像头直接显示YUYV422图像(12)

Qt-FFmpeg开发-打开摄像头直接显示YUYV422图像&#x1f4c0; 文章目录 Qt-FFmpeg开发-打开摄像头直接显示YUYV422图像&#x1f4c0;1、概述&#x1f4f8;2、实现效果&#x1f4bd;3、主要代码&#x1f50d;4、完整源代码&#x1f4d1; 更多精彩内容&#x1f449;个人内容分类汇…

四川汇聚荣:做拼多多网点需要具备什么能力?

做拼多多网点需要具备什么能力?这个问题对于想要在电商平台上开店的商家来说&#xff0c;是必须要了解的。拼多多作为国内领先的社交电商平台&#xff0c;吸引了众多商家入驻。那么&#xff0c;要想在拼多多上开网店&#xff0c;需要具备哪些能力呢?下面就从四个方面进行详细…

02-WPF_基础(二)

3、控件学习 控件学习 布局控件&#xff1a; panel、Grid 内容空间&#xff1a;Context 之恶能容纳一个控件或布局控件 代表提内容控件&#xff1a;内容控件可以设置标题 Header 父类&#xff1a;HeaderContextControl。 条目控件&#xff1a;可以显示一列数据&#xf…

【LAMMPS学习】八、基础知识(6.5)PyLammps 教程

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

Windows 11 下 kafka 的安装踩坑

安装 windows系统kafka小白入门篇——下载安装&#xff0c;环境配置&#xff0c;入门代码书写&#xff08;推荐&#xff09; kafka在windows下安装和使用入门教程 问题1 参考链接 运行kafka集成的zookeeper时&#xff0c;命令&#xff1a;bin\windows\zookeeper-server-star…

2.1 软件工程

第2章 信息技术知识 2.1 软件工程 现状&#xff1a; 开发软件的规模越来越大复杂度越来越高用户需求并不十分明确缺乏软件开发方法和工具方面的有效支持 软件成本日益增长、开发进度难以控制、软件质量无法保证、软件维护困难等问题日益突出。人们开始用工程的方法进行软件…

Codeforces Round 941 (Div. 2)(A,B,C,D,E)

比赛链接 这场难度不高&#xff0c;基本没考算法&#xff0c;全是思维题。B是推结论&#xff0c;C是博弈&#xff0c;D是构造&#xff0c;需要对二进制有一定理解&#xff0c;E是思维题&#xff0c;2300分的暴力和模拟。 A. Card Exchange 题意&#xff1a; 您有 n n n 张牌…

纯血鸿蒙APP实战开发——一镜到底“页面转场”动画

介绍 本方案做的是页面点击卡片跳转到详情预览的转场动画效果 效果图预览 使用说明 点击首页卡片跳转到详情页&#xff0c;再点击进入路由页面按钮&#xff0c;进入新的路由页面 实现思路 首页使用了一种视觉上看起来像是组件的转场动画&#xff0c;这种转场动画通常是通过…