设计模式-结构型模式-享元模式
概述
享元模式 : Flyweight Pattern : 是一种结构型设计模式,也叫做 蝇量模式。
主要通过对象的复用来减少对象创建的次数和数量,从而减少系统内存的使用和降低系统的负载。
主要作用:
避免在有大量对象时频繁创建和销毁造成系统资源的浪费,把对象中共同的部分抽象出来,如果有相同的业务请求,则直接返回内存中已有的对象,避免重新创建对象。
即 :在系统需要一个对象时,首先在系统中查找并尝试重用已有的对象,如果未找到匹配的对象,则创建新对象并将其缓存在系统中以便下次使用。
既然要从内存中匹配对象,因此,需要有一个类来充当对象池的角色,对象的获取,经过这个对象池。
核心概念
内部状态(Intrinsic State):
可以共享的状态,存储在对象内部,对所有调用者可见。
例如 : 围棋的棋子 , 只有 黑、白 两种颜色,这个就可以划分为 棋子的内部状态。
外部状态(Extrinsic State):
随外部环境变化的状态,不存储在对象内部,而是由客户端在调用时传递。
例如 : 围棋棋子的位置坐标,每一颗棋子在下棋过程中才能确定,即为外部状态。
核心角色
抽象享元(Flyweight):定义享元对象的接口,声明内部状态和操作。
具体享元(Concrete Flyweight):实现抽象享元接口,存储内部状态。
享元工厂(Flyweight Factory):负责创建和管理享元对象,维护对象池(共享对象的缓存)。
类图
案例代码
享元接口
public interface CheesePiece {
// 外部状态 : 坐标位置 : 下棋的时候才能确定
void display(int x,int y);
}
实现类
public class ConcreteCheesePiece implements CheesePiece{
// 内部状态 : 棋子的颜色
private String color;
// 构造方法、getter、setter 方法
@Override
public void display(int x, int y) {
System.out.println(color + " 落在了 ("+x+","+y+") 的位置");
}
}
享元工厂
public class CheesePieceFactory {
// 一个存储享元对象的容器
private static Map<String, CheesePiece> pool = new HashMap<>();
// 获取享元对象
public static CheesePiece getCheesePiece(String color) {
// 如果容器中没有这个对象,就创建一个,并放入容器中
if (!pool.containsKey(color)){
pool.put(color, new ConcreteCheesePiece(color));
}
// 返回享元对象
return pool.get(color);
}
}
客户端
public class Client {
public static void main(String[] args)
{
CheesePiece black = CheesePieceFactory.getCheesePiece("黑子");
CheesePiece white = CheesePieceFactory.getCheesePiece("白子");
black.display(1, 1);
white.display(2, 2);
// 验证一下,重复获取对象是否为同一个对象
CheesePiece black2 = CheesePieceFactory.getCheesePiece("黑子");
System.out.println(black == black2);
}
}
运行结果:
黑子 落在了 (1,1) 的位置
白子 落在了 (2,2) 的位置
true