设计模式 - 享元模式 Flyweight Pattern

一、概念

尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。当程序中存在大量相似对象,每个对象之间只是根据不同的使用场景有些许变化时。

|--------------------------|---------------------------|
| Flyweight 享元接口 | 定义所有对象共同的操作。 |
| Concrete Flyweight 具体享元类 | 具体的要被共享的对象,内部保存需要共享的内部状态。 |
| Flyweight 享元工厂 | 管理享元对象的创建和复用。 |

二、实现

2.1 享元接口

Kotlin 复制代码
interface IChess {
    fun move(column: Int, row: Int)
}

2.2 具体享元类

Kotlin 复制代码
enum class ChessColor {
    BLACK, WHITE
}

class Chess(
    val color: ChessColor
) : IChess {
    override fun move(column: Int, row: Int) = println("$color 棋子颜色走到了【行$column】【列$row】处")
}

2.3 享元工厂

Kotlin 复制代码
class ChessFactory {
    companion object {
        //用来存储已创建对象的容器
        private val chessContainer = mapOf<ChessColor, IChess>()
        //已有匹配对象则复用,未找到则创建新对象
        fun getChess(chessColor: ChessColor): IChess {
            return chessContainer[chessColor] ?: Chess(chessColor)
        }
    }
}

2.4 使用

Kotlin 复制代码
fun main() {
    ChessFactory.getChess(ChessColor.WHITE).move(3,2) //WHITE 棋子颜色走到了【行3】【列2】处
    ChessFactory.getChess(ChessColor.BLACK).move(5,4) //BLACK 棋子颜色走到了【行5】【列4】处
}
相关推荐
我不会插花弄玉3 小时前
7.函数【由浅入深-MySQL】
android·数据库·mysql
vilya4 小时前
手机端 Agent 怎么动起来:Kotlin 与 Python 之间的桥
android·agent
高晶4 小时前
Android 新手实战:从零搭建 WebRTC 在线直播系统
android·程序员
alexhilton4 小时前
为什么你的 LazyColumn 仍然卡顿
android·kotlin·android jetpack
>Andre<5 小时前
系统架构全景
android
hai_android9 小时前
Android 嵌套滑动冲突:内部拦截 vs 外部拦截实战
android·android studio·android jetpack
木子欢儿11 小时前
Zabbix 7.4 Alpine 版 Docker Compose 部署
android·运维·docker·容器·zabbix
素师良码12 小时前
第9篇:Android驱动踩坑实录:DSI RX FIFO前置脏0、数据错位复盘
android
夜雪一千12 小时前
如何在MySQL中实现字段级加密
android·数据库·mysql
夜雪一千12 小时前
MySQL 如何存储经纬度坐标:选型、建表、空间查询实战
android·mysql·adb