[Golang] 设计模式以及单例设计模式实例实现

news2024/11/26 4:23:49

😚一个不甘平凡的普通人,致力于为Golang社区和算法学习做出贡献,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘
🤗专栏:算法学习
🤗专栏:Go实战
💬个人主页:个人主页

在这里插入图片描述

文章目录

  • 设计模式是什么?
  • 单例模式概念
  • 单例设计模式实例:计数器

设计模式是什么?

设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案,用设计模式是为了复用代码、让代码更容易被他人理解、保证代码可靠性。

设计模式的六大原则:

  1. 开闭原则
    有开有闭原则,对扩展开放,但是对修改关闭。可以在程序需要拓展的时候使用,但是不能修改原有的代码来实现扩展。
  2. 里氏代换原则
    子类可以扩展父类的功能,但不能改变原有父类的功能
  3. 依赖倒转原则
    针对接口编程,依赖于抽象而不依赖于具体。简单解释就是面向接口编程,“抽象”就是接口或者抽象类,“具体”值得就是实现类;
  4. 接口隔离原则
    使用多个相互隔离的接口开发,比使用单个接口要好。目的是为降低类之间的耦合度。
  5. 迪米特法则
    最少知道原则,尽量降低类与类之间的耦合,一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立,防止高耦合度
  6. 合成复用原则
    它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

设计模式分类:

设计模式分为三类:创建型,行为型、结构型

这里主要针对创建型中的单例设计模式进行讲解

创建型:单例、工厂、抽象工厂、建造者、原型模式
单例模式:保证一个类仅有一个对象,并提供一个访问它的全局访问点。
工厂模式:定义一个用于创建对象的接口,让子类决定将哪一个类实例化,FactoryMethod使一个类的实例化延迟到其子类。
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

单例模式概念

单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
它的运作方式是这样的: 如果你创建了一个对象, 同时过一会儿后你决定再创建一个新对象, 此时你会获得之前已创建的对象, 而不是一个新对象。
和全局变量一样, 单例模式也允许在程序的任何地方访问特定对象。 但是它可以保护该实例不被其他代码覆盖。
在这里插入图片描述
适用场景:
1.如果程序中的某个类对于所有客户端只有一个可用的实例, 可以使用单例模式。
2.如果你需要更加严格地控制全局变量, 可以使用单例模式。

单例设计模式实例:计数器

下面我以实现一个计数器操作来实现一个简单的单例模式:

流程:
当之前没有创建过计数器 count 时,将创建一个新的计数器 count = 0
如果已经创建了一个计数器,则返回此实例实际保存的 count 数
如果我们调用方法 AddOne 一次,计数 count 必须增加 1

基本格式:

package singleton

// 为单例对象编写包的声明
type Singleton struct {
	count int
}

var instance *Singleton

func init() {
	instance = &Singleton{}
}
func GetInstance() *Singleton {
	if instance == nil {
		instance = new(Singleton)
	}
	return instance
}
func (s *Singleton) AddOne() int {
	s.count++
	return s.count
}

测试:

package singleton

import "testing"

// 测试
func TestGetInstance(t *testing.T) {
	count := GetInstance()
	if count == nil {
		t.Error("A new connextion object must have been made ")
	}
	expectedCounter := count
	currentCount := count.AddOne()
	if currentCount != 1 {
		t.Errorf("After calling for the first time to count,the count must be 1 but it is %d\n", currentCount)
	}
	count2 := GetInstance()
	if count2 != expectedCounter {
		t.Error("Singleton instances must be different")
	}

	currentCount = count2.AddOne()

	if currentCount != 2 {
		t.Errorf("After calling 'AddOne' using the second counter, the current count must be 2 but was %d\n", currentCount)
	}
}

运行结果:

在这里插入图片描述
在这里插入图片描述

参考链接:设计模式

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

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

相关文章

Django框架之视图的基本使用

Django框架之视图的基本使用 概述 在django中,视图方法简称视图,对web请求进行回应。 视图就是一个python函数,在views.py文件中定义。 定义视图 在project/myapp/views.py文件中定义 引入http from django.http import HttpResponse 视…

【C语言】实战练习

目录 1.计算体积&#xff1a; 2、根据父母身高计算孩子的理论身高&#xff1a; 3、三十六计的几计&#xff1a; 4、文本输出&#xff1a; 5、粮仓计数&#xff1a;​编辑 6、auto 7、static: 8、模拟用户注册系统&#xff1a; 1.计算体积&#xff1a; #include <std…

NetXpert XG2帮您解决“布线安装与维护”难题

在传输大量数据时&#xff0c;光纤变得越来越重要&#xff0c;而铜缆在未来也将继续发挥重要作用&#xff0c;因此我们不仅要比较两种类型布线的优缺点&#xff0c;还要探究光纤传输中的错误来源。 测试光缆传输损耗的准确性对于故障排除至关重要&#xff0c;特别是在光纤情况下…

27-Servlet执行原理

目录 1.Tomcat详解 ①接收请求&#xff1a; ②根据请求计算响应&#xff1a; ③返回响应&#xff1a; 2.Tomcat执行流程 2.1.Tomcat 初始化流程 2.2.Tomcat 处理请求流程 2.3.Servlet 的 service 方法的实现 在 Servlet 的代码中并没有写 main ⽅法&#xff0c;那么对应…

2022年中国预制菜市场规模已超过4000亿元,2026年将突破万亿

佛跳墙、小酥肉、酸菜鱼、猪肚鸡、煎牛排、炸鸡、小龙虾等等&#xff0c;这些需要花上长时间烹饪制作的大菜&#xff0c;现在只需用烤箱或空气炸锅几分钟就制作出来了&#xff0c;且味道还不赖。预制菜最大的优势在于方便&#xff0c;极大的省去了买菜洗菜、切菜、制作的繁琐程…

YOLOv5网络模型的结构原理讲解(全)

目录 前言1. 基本概念2. 输入端2.1 Mosaic 图像增强2.2 自适应锚框计算2.3 自适应图片缩放 3. Backbone层3.1 Focus结构3.2 CSP结构 3. Neck网络3.1 SPP结构3.2 PAN结构 4. 输出端4.1 Bounding box损失函数4.2 NMS非极大值抑制 前言 YOLOv5有几种不同的架构&#xff0c;各网络…

ChatGPT评微博热文“留给普通人的最后一扇门,快要关闭了”

目录 留给普通人的最后一扇门&#xff0c;快要关闭了 这篇文章你看过吗 普通人通过接受高等教育提升阶级的路还走得通吗&#xff0c;为什么大家都开始考公务员了 高等教育仍然是提升阶级的一条途径&#xff0c;但并不是唯一的途径。那还有哪些路径&#xff1f; 继续&#x…

【谷歌插件开发】获取当前网站COOKIE并上报HTTP-API

一 背景 由于本人每天需要登录网站查看数据并分析统计汇总&#xff0c;而每次机械式地搜索和简单计算&#xff0c;十分繁琐。我们可以写个定时任务&#xff0c;每天根据cookie获取网站数据并遍历统计。 脚本得以成功执行的关键是需要获取到COOKIE 故&#xff0c;写了个谷歌插件…

UE4架构初识(七)

目录 UE4仿真引擎学习 一、架构基础总结 1. 游戏世界 2. 数据和逻辑 3. 整体类图 UE4仿真引擎学习 一、架构基础总结 1. 游戏世界 在UE的眼里&#xff0c;游戏世界的万物皆Actor&#xff0c;Actor再通过Component组装功能。Actor又通过UChildActorComponent实现Actor之间的…

代码随想录之贪心合集

455 分发饼干 先排序之后按顺序比较 class Solution {public int findContentChildren(int[] g, int[] s) {//57Arrays.sort(g);Arrays.sort(s);int k0;int i0;int count0;while(k<s.length&&i<g.length){if(g[i]<s[k]){count;i;k;}else k;}return count;} }…

视频大文件传输的演变:从“卷轴男孩”到自动化

200年前&#xff0c;从纽约市到英国伦敦的单程旅行需要乘坐一艘跨大西洋轮船将近三周——如果你能负担得起的话&#xff0c;那就是。那些不能在满是汗水、狭窄的帆船上安顿大约一个半月的人。 今天&#xff0c;视频专业人士能够在几小时甚至几分钟内跨越相同的物理距离传输大量…

烟雾弹?突然转变?如何看待微软发声:中国是主要的对手

是的&#xff0c;我又回来了&#xff0c;今天要跟各位唠的还是ChatGPT的嗑。今天的新闻是啥呢&#xff1f; 《微软总裁&#xff1a;中国将是 ChatGPT 的主要对手&#xff0c;我们的优势不大》 说实话&#xff0c;我看到这个新闻的时候&#xff0c;大感震撼&#xff0c;在相关报…

YOLOv5快速入门demo

文章目录 1. 官网下载 yolo_master2. 下载得到yolov5-maser.zip 对其进行解压3. 安装所需要的包4. 官网下载一个与训练模型5. 测试一个小demo 使用detect.py6. 训练一个模型 1. 官网下载 yolo_master https://gitcode.net/mirrors/ultralytics/yolov5 下载克隆 2. 下载得到…

HART协议数据格式避坑(C语言压缩字符串Packed-ASCII和ASCII转换)

HART协议数据格式避坑&#xff08;C语言压缩字符串Packed-ASCII和ASCII转换&#xff09; 首先HART数据格式如下&#xff1a; 重点就是浮点数和字符串类型 Latin-1就不说了 基本用不到 浮点数 浮点数里面 如 0x40 80 00 00表示4.0f 在HART协议里面 浮点数是按大端格式发送的…

oracle 18c dataguard 从库scn 不更新BUG

Bug 29056767 - STANDBY: Datafiles Checkpoint not Updated at Standby Database when Media Recover is running (Doc ID 29056767.8)正在上传…重新上传取消To Bottom Bug 29056767 STANDBY: Datafiles Checkpoint not Updated at Standby Database when Media Recover i…

IPEmotion控制模块-PID循环应用

IPEmotion专业版、开发版支持控制模块&#xff0c;并且该模块支持函数发生器、PID控制器、路由器、序列控制和序列控制块以及参考曲线生成器。本文主要针对PID&#xff08;P&#xff1a;Proportional control 比例控制&#xff1b;I&#xff1a;Integral control 积分控制&…

Linux tail 命令

前言 Linux 实时查看日志文件&#xff0c;最主要使用的就是tail命令。 linux tail命令用于显示文件尾部的内容&#xff0c;默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个&#xff0c;则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”…

同步辐射全散射PDF分析:探究材料结构的新方法

同步辐射全散射PDF&#xff08;Pair Distribution Function&#xff09;分析是一种非常强大的物质结构研究方法。它通过同步辐射技术&#xff0c;将X射线或中子散射的数据进行处理&#xff0c;得到物质的原子间距分布函数&#xff0c;从而揭示物质的微观结构信息。该方法已经在…

Vue3上传(Upload)

可自定义设置以下属性&#xff1a; 接受上传的文件类型&#xff08;accept&#xff09;&#xff0c;类型&#xff1a;string&#xff0c;默认 *&#xff0c;&#xff0c;与<input type"file">的accept属性一致&#xff0c;详见 https://developer.mozilla.org/…

数据结构与算法(五):算法专项 Hash、BitMap、Set、布隆过滤器、中文分词、Lucene 倒排索引

算法专项 Hash、BitMap、Set、布隆过滤器、中文分词、Lucene 倒排索引 Hash 思考&#xff1a; 给你N&#xff08;1<N<10&#xff09;个自然数,每个数的范围为&#xff08;1~100&#xff09;。现在让你以最快的速度判断某一个数是否在这N个数内&#xff0c;不得使用已经…