设计模式 - 享元模式 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】处
}
相关推荐
三少爷的鞋8 小时前
Java 线程自上而下,Kotlin 协程自下而上
android
好的佩奇9 小时前
Dart 之增强枚举
android·flutter·dart
梦影_10 小时前
MySQL进阶教程(五)—— SQL调优(下)
android·大数据·数据库·后端·sql·mysql·database
好的佩奇12 小时前
蓝牙之无线电与通信距离
android·flutter·蓝牙
vilya13 小时前
我把一套完整的 Python Agent 运行时塞进手机 APK:依赖闭包、Rust 轮子和三个真机坑
android
呆呆敲代码的小Y15 小时前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
geovindu15 小时前
rust: Semaphore Pattern
开发语言·后端·设计模式·rust·代理模式·企业级信号量模式·同步型模式
是2的10次方啊15 小时前
设计模式与生活⑧:快递到了,别一直刷物流
设计模式
思想觉悟16 小时前
SEAndroid实战
android·linux·c++
思想觉悟17 小时前
Aosp开发磨刀石之ADB速查
android·c++