模拟一个新闻网站,使用的形式可以有: 微博、微信、新闻客户端等方式。
但是每种方式只会有一个对象, 可以由多个用户使用。
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
可以看出方式对象最多只有三种,无论有多少个用户,使用多少次