美文网首页
设计模式——享元模式

设计模式——享元模式

作者: DevilRoshan | 来源:发表于2020-11-03 23:23 被阅读0次

    什么是享元模式?

    运用共享技术有效地支持大量细粒度的对象。

    实现

    // 具体网站类
    type ConcreteWebSite struct {
        name string
    }
    
    func NewConcreteWebSite(name string) *ConcreteWebSite {
        return &ConcreteWebSite{name: name}
    }
    
    func (this *ConcreteWebSite) use() {
        fmt.Println("网站分类:", this.name)
    }
    
    // 网络工厂类
    type WebSiteFactory struct {
        pool map[string]*ConcreteWebSite
    }
    
    // 获得网站分类
    func (this *WebSiteFactory)GetWebSiteCategory(key string) *ConcreteWebSite {
        if _, ok := this.pool[key]; !ok {
            this.pool[key] = NewConcreteWebSite(key)
        }
        return this.pool[key]
    }
    
    func (this *WebSiteFactory)GetSiteCount() int {
        return len(this.pool)
    }
    
    func NewWebSiteFactory(pool map[string]*ConcreteWebSite) *WebSiteFactory {
        return &WebSiteFactory{pool:pool}
    }
    
    func TestNewWebSiteFactory(t *testing.T) {
        factory := NewWebSiteFactory(make(map[string]*ConcreteWebSite))
        fx := factory.GetWebSiteCategory("产品展示")
        fx.use()
        fy:= factory.GetWebSiteCategory("产品展示")
        fy.use()
        fz:= factory.GetWebSiteCategory("产品展示")
        fz.use()
        fa:= factory.GetWebSiteCategory("博客")
        fa.use()
        fb:= factory.GetWebSiteCategory("博客")
        fb.use()
        fc:= factory.GetWebSiteCategory("博客")
        fc.use()
        fmt.Println("网站分类总数为: ", factory.GetSiteCount())
    }
    // === RUN   TestNewWebSiteFactory
    // 网站分类: 产品展示
    // 网站分类: 产品展示
    // 网站分类: 产品展示
    // 网站分类: 博客
    // 网站分类: 博客
    // 网站分类: 博客
    // 网站分类总数为:  2
    // --- PASS: TestNewWebSiteFactory (0.00s)
    // PASS
    

    优点

    • 大大减少了对象的创建,降低了程序内存的占用,提高效率。

    缺点

    • 提高了系统的复杂度。需要分离出内部状态和外部状态,而外部状态具有固化特性,不应该随着内部状态的改变而改变。

    使用场景

    • 系统中存在大量相似对象;
    • 需要缓冲池的场景,例如:数据库连接池。

    注意

    • 注意划分内部状态和外部状态,否则可能会引起线程安全问题;
    • 这些类必须有一个工厂类加以控制。

    相关文章

      网友评论

          本文标题:设计模式——享元模式

          本文链接:https://www.haomeiwen.com/subject/safyvktx.html