享元模式笔记

模拟一个新闻网站,使用的形式可以有: 微博、微信、新闻客户端等方式。

但是每种方式只会有一个对象, 可以由多个用户使用。

 

1. 抽象基类(Flyweight角色)

abstract class Website {
    abstract var TAG:String
    abstract fun use(user: FlyWeightUser)
}

其中,用户类:

data class FlyWeightUser (
    val name:String
)

 

2.具体实现类(ConcreteFlyweight角色)

import android.util.Log

class WeiboWebsite: Website() {
    override var TAG: String
        get() = "Weibo"
        set(value) {}

    override fun use(user: FlyWeightUser) {
        Log.d("WeiboWebsite", "微博 ${user.name}使用中....")
    }
}
import android.util.Log

class NewsWebsite : Website() {
    override var TAG: String
        get() = "News"
        set(value) {}

    override fun use(user: FlyWeightUser) {
        Log.d("NewsWebsite", "新闻 ${user.name}使用中....")
    }
}
import android.util.Log

class WeiXinWebsite: Website() {
    override var TAG: String
        get() = "Weixin"
        set(value) {}

    override fun use(user: FlyWeightUser) {
        Log.d("WeiXinWebsite", "微信 ${user.name}使用中....")
    }
}

3. 对象生成工厂(FlyweightFactory角色)

object WebsiteFactory {
    var map = mutableMapOf<String, Website>()

    init {
        map.clear()
    }

    fun getWebsite(tag: String): Website? {
        if (map[tag] == null) {
            when (tag) {
                "Weibo" -> WeiboWebsite()
                "Weixin" -> WeiXinWebsite()
                "News" -> NewsWebsite()
                else -> null
            }?.also {
                it.TAG = tag
                map[tag] = it
            }
        }
        return map[tag]
    }

    fun getSize(): Int {
        return map.size
    }

}

4. 客户端使用

    @Test
    fun testFlyweight(){
        Log.d(TAG, "====================Flyweight====================")

        Log.d(TAG, "start map size = ${WebsiteFactory.getSize()}")

        var Tom = FlyWeightUser("Tom")
        var Petter = FlyWeightUser("Petter")
        var Jame = FlyWeightUser("Jame")
        var Putty = FlyWeightUser("Putty")

        WebsiteFactory.getWebsite("Weibo")?.use(Tom)
        Log.d(TAG, "current map size = ${WebsiteFactory.getSize()}")

        WebsiteFactory.getWebsite("Weibo")?.use(Petter)
        Log.d(TAG, "current map size = ${WebsiteFactory.getSize()}")

        WebsiteFactory.getWebsite("Weixin")?.use(Jame)
        Log.d(TAG, "current map size = ${WebsiteFactory.getSize()}")

        WebsiteFactory.getWebsite("News")?.use(Putty)
        Log.d(TAG, "current map size = ${WebsiteFactory.getSize()}")

        WebsiteFactory.getWebsite("Weixin")?.use(Tom)
        Log.d(TAG, "current map size = ${WebsiteFactory.getSize()}")

        WebsiteFactory.getWebsite("News")?.use(Jame)
        Log.d(TAG, "current map size = ${WebsiteFactory.getSize()}")
    }

5. 输出结果


10-27 15:24:22.512 D DesignPattern:         ====================Flyweight==================== 
10-27 15:24:22.513 D DesignPattern:         start map size = 0 
10-27 15:24:22.513 D WeiboWebsite:          微博 Tom使用中.... 
10-27 15:24:22.513 D DesignPattern:         current map size = 1 
10-27 15:24:22.513 D WeiboWebsite:          微博 Petter使用中.... 
10-27 15:24:22.514 D DesignPattern:         current map size = 1 
10-27 15:24:22.514 D WeiXinWebsite:         微信 Jame使用中.... 
10-27 15:24:22.514 D DesignPattern:         current map size = 2 
10-27 15:24:22.514 D NewsWebsite:           新闻 Putty使用中.... 
10-27 15:24:22.514 D DesignPattern:         current map size = 3 
10-27 15:24:22.514 D WeiXinWebsite:         微信 Tom使用中.... 
10-27 15:24:22.514 D DesignPattern:         current map size = 3 
10-27 15:24:22.514 D NewsWebsite:           新闻 Jame使用中.... 
10-27 15:24:22.514 D DesignPattern:         current map size = 3 

可以看出方式对象最多只有三种,无论有多少个用户,使用多少次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值