Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
享元(Flyweight)模式:顾名思义就是被共享的单元。意图是复用对象,节省内存,提升系统的访问效率。比如在红白机冒险岛游戏中的背景花、草、树木等对象,实际上是可以多次被不同场景所复用共享,也是为什么以前的游戏占用那么小的内存,却让我们感觉地图很大的原因。
一、享元模式介绍
1.1 享元模式的定义
享元模式的定义是:运用共享技术来有效地支持大量细粒度对象的复用。
这里就提到了两个要求:细粒度和共享对象。而正是因为要求细粒度,那么势必会造成对象数量过多而且对象性质相近。所以我们可以将对象分为:内部状态和外部状态,内部状态指对象共享出来的信息,存储在享元信息内部,不会随着环境改变;外部状态指对象得以依赖的标记,会随着环境改变,不可以共享。根据是否共享,可以分成两种模式:
- 单纯享元模式:该模式中所有具体享元类都是可以共享,不存在非共享具体享元类
- 复合享元模式:将单纯享元对象使用组合模式加以组合,可以形成复合享元对象
实际上享元模式的本质就是缓存共享对象,降低内存消耗。
1.2 享元模式的结构
我们可以根据享元模式的定义画出大概的结构图,如下所示:
FlyweightFactory
:享元工厂,负责创建和管理享元角色Flyweight
:抽象享元,是具体享元类的基类,提供具体享元需要的公共接口SharedFlyweight、UnSharedFlyweight
:具体享元角色和具体非享元类Client
:客户端,调用具体享元和非享元类
1.3 享元模式的实现
根据上面的类图可以实现如下代码:
/**
* @description: 抽象享元类
* @author: wjw
* @date: 2022/4/2
*/
public interface Flyweight {
/**
* 抽象享元方法
* @param state 代码外部状态值
*/
public void operation(int state);
}
/**
* @description: 具体享元类
* @author: wjw
* @date: 2022/4/2
*/
public class SharedFlyweight implements Flyweight{
private String key;
public SharedFlyweight(String key) {
System.out.println("具体的享元类:" + key + "已被创建");
}
@Override
public void operation(int state) {
System.out.println("具体的享元类被调用:" + state);
}
}
/**
* @description: 非共享的具体类,并不强制共享
* @author: wjw
* &#