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

news/2024/11/19 12:31:51/

😚一个不甘平凡的普通人,致力于为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 *Singletonfunc 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 singletonimport "testing"// 测试
func TestGetInstance(t *testing.T) {count := GetInstance()if count == nil {t.Error("A new connextion object must have been made ")}expectedCounter := countcurrentCount := 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.ppmy.cn/news/51003.html

相关文章

vs2010 MSBuild Example

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言先加入相关的头文件和库文件。 [可以参考](http://msdn.microsoft.com/en-us/library/7szfhaft.aspx) 一、一级标题二级标题三级标题四级标题五级标题六级标题 …

P1030 [NOIP2001 普及组] 求先序排列

题目描述 给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8≤8)。 输入格式 共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。 输出…

Android之 Bitmap使用

一,简介 1.1 Bitmap是一种图片在内存中的表现形式,不管是png,还是jpg最终都是以bitmap的形式显示到控件上面。 Bitmap是一种位图,位图​是点阵图像​或栅格图像,是由称作像素(图片元素)的单个…

从初识RabbitMQ到安装了解

一、同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应,但是你却不…

【Python】matplotlib设置图片边缘距离和plt.lengend图例放在图像的外侧

一、问题提出 我有这样一串代码: import matplotlib.pyplot as plt plt.figure(figsize (10, 6)) " 此处省略代码 " legend.append("J") plt.legend(legend) plt.xlabel(recall) plt.ylabel(precision) plt.grid() plt.show()我们得到的图像…

POLARDB 从一个使用者的角度来说说,POALRDB 怎么打败 MYSQL RDS

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

Object Manager中的Hierarchy Columns

【前言】:最近偶然发现Object Manager中多了一项Hierarchy Columns,正好在做Case Mgmt这块的业务,需要做Case Hierarchy,或许熟悉这个新概念对后续方案的落地有一定启发。 #1. Account Hierarchy - 这个是标准功能,Acc…

React基础学习(一)

一、虚拟DOM和真实DOM <script type"text/babel"> // 此处一定要写babel!!!!!!!// 1. 创建虚拟DOM// const VDOM <h1 id"title">Hello, React!</h1> // 此处一定不要写引号 因为这不是字符串!!!!!!!const VDOM ( // 如果有多层嵌套&a…