在go语言中单例模式、简单工厂模式、策略模式实现代码示例
设计模式(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)
相关文章