目录

结构型:享元模式

释义

享元模式,“元”即某个属性,“享元”即共享属性。如果计划创建的对象有某个属性值与已存在的实例相同的话,则共享这个属性,即直接用这个实例而不是重新创建。

/%E7%BB%93%E6%9E%84%E5%9E%8B%E4%BA%AB%E5%85%83%E6%A8%A1%E5%BC%8F/%E7%BB%93%E6%9E%84%E5%9E%8B%EF%BC%9A%E4%BA%AB%E5%85%83%E6%A8%A1%E5%BC%8F.resources/FF9228CD-390F-403B-88E4-EEA7A55022B5.png
享元模式
ShapeFactory创建Shape,如果计划创建的Shape的某个属性和Map<Shape>中已经存在某个实例相同,则直接取用Map<Shape>中的那个Shape

基础类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
interface Shape {
    fun draw()
}

class Circle(
    var color
) : Shape {
    override fun draw() {
        drawCircle()
    }
}

工厂类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class ShapeFactory {
    private val circleMap: MutableMap<String, Shape> = mutableMapOf()
    
    fun getCircle(color: String) {
        // 查找Map中有没有相同color的Circle
        var circle: Circle = circleMap.get(color) as Shape
        // 如果没有则创建新的Circle
        if(circle == null) {
            circle = Circle(color)
            // 添加到Map中
            circle.set(color, circle)
        }
        
        return circle
    }
}

使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
fun main() {
    val red: String = "Red"
    
    val shapeFactory: ShapeFactory = ShapeFactory()
    
    // 第一次circleMap中还没有color为Red的,因此会创建
    val circle1 = shapeFactory.getCircle("Red") 
    // 第二次circleMap中已经有color为Red的circle,会直接从circleMap中获取
    val circle2 = shapeFactory.getCircle("Red") 
}