标签:初始化 singleton data Golang Go New type Pool


Go1

对象池化设计:   将池对象通过Chanel方式进行借出与还入,利用Go本身的特性实现更多优势。比如select分支可以进行优雅的限流、超时熔断等操作的。   思路:将需要池化的对象通过Channel进行包装,使用与归还都通过Channel的方式进行
package pool

type Pool chan *Object

// 初始化池,可指定容量
func New(total int) *Pool {
    p := make(Pool, total)

    for i := 0; i < total; i++ {
        p <- new(Object)
    }
    return &p
}
使用:
p := pool.New(2)

select {
case obj := <-p:
    obj.Do( /*希望池中对象进行的操作*/ )

    p <- obj // 使用完毕归还到池中
default:
    // 池资源无剩余,延迟重试或者直接告知失败等操作
    return
}

 

对象单例设计:   这里的实现是具有Go特色的调用方式,与double check的方式相比,更加优雅却达到相同效果   思路:利用sync包提供的once锁进行限制创建过程仅执行一次
package singleton

type singleton map[string]string

var (
    once sync.Once

    instance singleton
)

func New() singleton {
    once.Do(func() {
        instance = make(singleton)
    })

    return instance
}
使用示例:
s := singleton.New()

s["this"] = "that"

s2 := singleton.New()

fmt.Println("This is ", s2["this"])

//output:  This is that

 

工厂模式设计:   与面向对象的语言思路相同,只是这里的接口继承不再是显式调用,而是更加灵活的Duck-Type方式   思路:只要是隐式实现接口Store的,都可通过Store接口接收对象,并调用接口定义的方法(里氏替换原则)
package data

import "io"

// 接口限定了能力(调用的方法)
type Store interface {
    Open(string) (io.ReadWriteCloser, error)
}

type StorageType int

const (
    DiskStorage StorageType = 1 << iota
    TempStorage
    MemoryStorage
)

func NewStore(t StorageType) Store {
    // 通过枚举来创建实际创建的对象类型
    switch t {
    case MemoryStorage:
        return newMemoryStorage( /*...*/ )
    case DiskStorage:
        return newDiskStorage( /*...*/ )
    default:
        return newTempStorage( /*...*/ )
    }
}
使用示例:
s, _ := data.NewStore(data.MemoryStorage)
f, _ := s.Open("file")

n, _ := f.Write([]byte("data"))
defer f.Close()

 

 

代码来源是Github上一个开源项目,项目内容是Go相关的常用设计模式的实现,很实用易懂: https://github.com/tmrts/go-patterns

Go2

标签:初始化,singleton,data,Golang,Go,New,type,Pool
来源: https://www.cnblogs.com/CattaC/p/10564744.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。