在go语言中单例模式、简单工厂模式、策略模式实现代码示例
Go  /  管理员 发布于 1年前   326
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
下面是用go语言实现单例模式、简单工厂模式、策略模式
单例模式:
某个类只能有一个实例,提供一个全局的访问点。
简单工厂:
一个工厂类根据传入的参量决定创建出那一种产品类的实例。
策略模式:
定义一系列算法,把他们封装起来,并且使它们可以相互替换。
简单工厂+单例模式示例代码:
//Singleton 是单例模式类
type SingletonFactory struct{}
// 定义接口
type RepoAPI interface {
Put(data map[string]interface{}) map[string]interface{}
}
var singleton *SingletonFactory
var once sync.Once
// GetInstance 用于获取单例模式对象,多协程的场景下不是线程安全的,使用 sync.Once 来实现
func GetFactoryInstance() *SingletonFactory {
once.Do(func() {
singleton = &SingletonFactory{}
})
return singleton
}
// 简单工厂 创建对应的服务类
func (t *SingletonFactory) FactoryCreate(cate, token string) RepoAPI {
if cate == "github" {
return &github.GithubConstruct{
Token: token,
}
} else if cate == "gitee" {
return &gitee.GiteeConstruct{
Token: token,
}
}
return nil
}
策略模式示例代码:
// 策略模式类,定义 service 属性 实际为具体的业务类
type RepoStrategyConstruct struct {
Service *factory.RepoAPI
}
// 定义策略方法 入参为指定的接口(具体的业务类)
func RepoStrategy(api factory.RepoAPI) *RepoStrategyConstruct {
return &RepoStrategyConstruct{
Service: &api,
}
}
服务层实现
注意:都要实现 接口 RepoAPI 定义的方法
//服务1
type GiteeConstruct struct {
Token string
}
func (t *GiteeConstruct) Put(data map[string]interface{}) map[string]interface{} {
log.Println("gitee",data,t.Token)
return nil
}
//服务2
type GithubConstruct struct {
Token string
}
func (t *GithubConstruct) Put(data map[string]interface{}) map[string]interface{} {
log.Println("github",data,t.Token)
return nil
}
控制层调用
// 简单工厂调用
log.Println("单例 | 简单工厂模式调用")
instance := factory.GetFactoryInstance()
create := instance.FactoryCreate("gitee","gitee-token")
create.Put(nil)
// 策略模式调用
log.Println("策略模式调用")
repoStrategy := strategy.RepoStrategy(&github.GithubConstruct{
Token: "github-token",
})
service := *repoStrategy.Service
service.Put(nil)
原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..博主 在
科学上网翻墙之v2rayN-Core客户端免费公益节点使用教程中评论 @ mashrdn 多切换几个节点测试,免费ssr是没那么稳..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号