在go语言中单例模式、简单工厂模式、策略模式实现代码示例

2023-06-01 00:00:00 模式 示例 工厂

设计模式(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)

相关文章