go语言的部分的

设计模式
设计模式1
23种设计模式
为什么需要函数选项模式

package mainimport "fmt"type dbOptions struct {Host     stringPort     intUserName stringPassword stringDBName   string
}type Option func(*dbOptions)// WithHost 定义一个函数选项 这个函数主要用来设置Host
func WithHost(host string) Option {return func(o *dbOptions) {o.Host = host}
}func NewOpts(options ...Option) dbOptions {dbopts := &dbOptions{Host: "127.0.0.1",Port: 3306,}for _, option := range options {option(dbopts)}return *dbopts
}func main() {opts := NewOpts(WithHost("192.168.0.1"))fmt.Println(opts)//函数选项大量运用
}

单例模式

单例设计模式详细介绍

package mainimport ("sync""sync/atomic"
)type DBPool struct {Host     stringPort     intUserName string
}var lock sync.Mutexvar dbPoolIns *DBPoolvar initialed uint32// GetDBPool 有问题的方法,并发
// 加锁 功能上没有问题,但是性能不好(放到外面)
// 高并发下,有bug
// goroutine1进来,实例化化dbPoolIns = &DBPool{}进行到一半,goroutine2进来读取不为空了,返回dbPookIns
func GetDBPool() *DBPool {if atomic.LoadUint32(&initialed) == 1 { //原子性解决return dbPoolIns}lock.Lock()defer lock.Unlock()if initialed == 0 {dbPoolIns = &DBPool{}atomic.StoreUint32(&initialed, 1)}return dbPoolIns
}var once sync.Once //运行一次就行了func GetDBPool2() *DBPool {once.Do(func() {dbPoolIns = &DBPool{}})return dbPoolIns
}func main() {}

简单工厂模式

package mainimport "fmt"/*
在小明的学校,每一年开学都会发教材,
主要是包括语文书,数学书,英语书,还有各种练习试卷。
这一天,小明去领了三本教材,分别是语文书,数学书和英语书,老师忙不过来,指定某个同学去发书
同学都去这个同学这里去领书。这个同学就是工厂。
*/type Book interface {Name() string
}type chineseBook struct {name string
}type mathBook struct {name string
}type englishBook struct {name string
}func (cb *chineseBook) Name() string {return cb.name
}func (mb *mathBook) Name() string {return mb.name
}func (eb *englishBook) Name() string {return eb.name
}func GetBook(name string) Book {if name == "语文书" {return &chineseBook{name: "语文书"}} else if name == "数学书" {return &mathBook{name: "数学书"}} else if name == "英语书" {return &englishBook{name: "英语书"}}return nil
}func main() {//暴露了结构体,这个实例化过程简单,实际开发中这个创建过程可能很复杂//cb := &chineseBook{name: "语文书"}fmt.Println(GetBook("语文书").Name())fmt.Println(GetBook("数学书").Name())
}

抽象工厂模式

package mainimport "fmt"/*
在小明的学校,每一年开学都会发教材,
主要是包括语文书,数学书,英语书,还有各种练习试卷。
这一天,小明去领了三本教材,分别是语文书,数学书和英语书,老师忙不过来,指定某个同学去发书
同学都去这个同学这里去领书。这个同学就是工厂。
*/type Book interface {Name() string
}type Paper interface {Name() string
}
type chineseBook struct {name string
}func (cb *chineseBook) Name() string {return cb.name
}type chinesePaper struct {name string
}func (cp *chinesePaper) Name() string {return cp.name
}type mathBook struct {name string
}func (mb *mathBook) Name() string {return mb.name
}type englishBook struct {name string
}func (eb *englishBook) Name() string {return eb.name
}// Person person具体指定的是某个类型的人,我现在想抽象出一个角色,这个角色就叫发书人
//type Person struct {
//}// Assigner 发书人
type Assigner interface {GetBook(name string) BookGetPaper(name string) Paper
}type assigner struct{}func (ass *assigner) GetBook(name string) Book {if name == "语文书" {return &chineseBook{name: "语文书"}} else if name == "数学书" {return &mathBook{name: "数学书"}} else if name == "英语书" {return &englishBook{name: "英语书"}}return nil
}func (ass *assigner) GetPaper(name string) Paper {if name == "语文发书人" {return &chinesePaper{name: "语文发书人"}}return nil
}type chineseBookAssigner struct {
}func (cba *chineseBookAssigner) GetBook(name string) Book {if name == "语文书" {return &chineseBook{name: "语文书"}}return nil
}func main() {var a assignerfmt.Println(a.GetBook("语文书").Name())fmt.Println(a.GetBook("数学书").Name())var cba chineseBookAssignerfmt.Println(cba.GetBook("语文书").Name())fmt.Println(a.GetPaper("语文发书人").Name())
}

责任链模式–行为模式

责任链模式实现

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

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

相关文章

Docker(一)简介和基本概念

一、简介 本章将带领你进入 Docker 的世界。 什么是 Docker? 用它会带来什么样的好处? 好吧,让我们带着问题开始这神奇之旅。 1.什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目&…

【文档数据库】ES和MongoDB的对比

目录 1.由文档存储牵出的问题 2.什么是MongoDB? 3.ES和MongoDB的对比 1.由文档存储牵出的问题 本文或者说关于mongodb的这个系列文章的源头: 前面我们聊过了分布式链路追踪系统,在基于日志实现的分布式链路追踪的方式seluthzipkin中为了…

mysql常见的需求,对于关键字的使用

如何使用MySQL将列数据转化为逗号分隔的形式。我们可以使用内置函数GROUP_CONCAT()来实现这个功能 如何使用MySQL将列数据转化为逗号分隔的形式。我们可以使用内置函数GROUP_CONCAT()来实现这个功能,也可以根据实际需求自定义一个函数。这种技术在一些需要对数据进…

Qlib+backtrader:2014.1.1-2023.9.20最新回测结果,可以实盘吗?

今年以来,在研究了qlib和backtrader的基础上,把二者结合起来进行了一个策略研究。简单说就是用qlib在200只股票的股票池中进行滚动训练与预测(walk forward),总体数据范围是2005到2023年,以20日间隔滚动训练…

C语言中各变量声明及注意事项

在C语言中,变量的声明语句用于告诉编译器该变量的类型、名称以及存储类型等信息。以下是C语言中常见的变量声明语句及其使用规则: 1. 基本数据类型的声明: 整型(int):用于声明整数类型的变量,…

寒假冬令营(算法编程)

1月18日(二分) 题目描述(一) 278. 第一个错误的版本 你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的&#xff0…

OpenGL:关于纹理映射时任意四边形中的插值问题(二)

OpenGL:关于纹理映射时任意四边形中的插值问题-CSDN博客 上次是使用逆双线性插值的方法解决四边形纹理映射时产生的折痕问题。 其实也有点问题,就是双线性插值会使得纹理产生一点扭曲。 不是投影的效果。 想达到纹理投影的效果,可以使用透…

CentOS查看修改时间

经常玩docker的朋友应该都知道,有很多的镜像运行起来后,发现容器里的系统时间不对,一般是晚被北京时间8个小时(不一定)。 这里合理怀疑是镜像给的初始时区是世界标准时间(也叫协调世界时间)。 有…

C++ 之LeetCode刷题记录(十二)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 69. x 的平方根 示例 1: 输入:x 4 输出:2 示例 2: 输入&#x…

品牌全球化:关于跨界合作的探索与解析

在全球化的时代背景下,品牌出海已经成为企业发展的重要战略之一。然而,面对文化差异、市场竞争和消费者需求等多重挑战,品牌如何成功地打入海外市场,是许多企业面临的难题。跨界合作作为一种新兴的商业模式,正逐渐成为…

JavaSE核心基础-流程语句-笔记

1.键盘录入 import java.util.Scanner; Scanner scanner new Scanner(System.in); scanner.next();// 可以得到输入的字符串内容 scanner.nextInt();// 整型数据 scanner.nextDouble();// 浮点型数据 2.流程控制语句…

一、Flask学习之HTML

一、Flask学习之HTML 1.运行简单页面 首先需要搭建环境: pip install flaskfrom flask import Flaskapp Flask(__name__)# 创建了网址 /show/info 和函数index之间的对应关系,以后用户在浏览器上访问/show/info,网站自动执行index函数 ap…

HBase学习七:Compaction

1、简介 Compaction是从一个Region的一个Store中选择部分HFile文件进行合并。其目的为了减少 HFile 的个数跟清理掉过期和删除的数据。 合并原理是,先从这些待合并的数据文件中依次读出KeyValue,再由小到大排序后写入一个新的文件。之后,这个新生成的文件就会取代之前已合…

POI和EasyExcel学习

1.POI 1.1POI简介 在Java中,POI是指Apache POI(Poor Obfuscation Implementation),它是一个开源的Java库,用于处理Microsoft Office文档格式文件,如Excel、Word、PowerPoint等。POI提供了一组API&#xf…

如何在CentOS下使用Docker部署Halo博客网站并结合内网穿透远程访问

文章目录 ⛳️ 推荐1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤:1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 ⛳️ 推荐 前些天发现了…

记一次 .NET某道闸收费系统 内存溢出分析

一:背景 1. 讲故事 前些天有位朋友找到我,说他的程序几天内存就要爆一次,不知道咋回事,找不出原因,让我帮忙看一下,这种问题分析dump是最简单粗暴了,拿到dump后接下来就是一顿分析。 二&…

分布式拒绝服务攻击(DDoS)| 防御 | 监测

概述 介绍什么是分布式拒绝服务攻击(DDoS)。解释 DDoS 攻击对网络和服务的影响。 分布式拒绝服务攻击(DDoS)是一种网络攻击,通过大量流量或请求淹没目标服务器/网络资源,导致服务不可用或降级。 其主要特…

Openwrt 下动态路由协议(quagga-OSPF)配置与验证

文章目录 前言网络拓扑静态路由方式动态路由方式Openwrt下 Quagga 安装Quagga 配置R1路由器zebra配置R1路由器ospf配置R2路由器zebra配置R2路由器ospf配置OSPF协议分析REF本文将在两台openwrt系统上安装配置quagga, 搭建一套完整环境,来验证OSPF动态路由的基本功能和实际效果,…

顶尖CTO们预测:平台工程将成为DevOps领域中最重要的部分

在行业专家对 2024 年 DevOps 和相关技术将如何发展和影响业务进行了深思熟虑、富有洞察力的判断后,产生了一下对于平台工程和 DevOps 成本的预测。 01 平台工程 —— DevOps 领域最重要的事情 Jon Mort 认为明年 DevOps 领域最重要的事情仍将是平台工程。在最基本的…

面经-redis缓存

什么是Redis Redis(Remote Dictionary Server)键只能为字符串,值:字符串、列表、集合、散列表、有序集合。Redis 用来做分布式锁。支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。 Redis为什么这么快 完全基于内存,数据结构简单…