享元模式

97 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

\

前言

  • 首先我们得明确一个道理内存使用必须得受限制。否则程序无止尽的读取内存将会带来很大的危害。Don't repeat yourself. 简单来说 享元模式就是共享对象。有些对象本身不一样,但通过一点点变化后就可以复用,我们编程时可能稍不注意就会忘记复用这些对象、

UML

  • 主要的3个角色

1.抽象享元角色(IFlyweight): 享元对象抽象基类或接口,同时定义出对象的外部状态和内部状态的接口或实现。

2.具体享元角色(ConcreteFlyweight):实现抽象角色定义的业务。该角色的内部状态处理应该与环境无关,不会出现一个操作改变内部状态,同时修改了外部状态的情况

3.享元工厂(FlyweightFactory):负责管理享元对象池和创建享元对象

image.png

  • 最终我们能够通过工厂类调用到同名的类而不需要重复的创建。
public static void main(String[] args) {
    IFlyweight flyweight1 = FlyweightFactory.getFlyweight("aa");
    IFlyweight flyweight2 = FlyweightFactory.getFlyweight("aa");
    IFlyweight flyweight3 = FlyweightFactory.getFlyweight("cc");
    flyweight1.operation("wwwww");
    flyweight2.operation("ttttt");
    flyweight3.operation("wwwww");
}

场景

  • 在JDK中常量池大家都应该是熟悉的,在常量池中使用的就是我们今天的享元模式。他通过String 字符来进行创建相同管理相同的类,从而达到我们的常量池的功能。每个字符放在常量池中我们都是通过字面内容进行存放的。当然String类也给我提供了覆盖常量池的方法,

总结

  • 除此以外我们spring的bean管理也是一种抽象的享元模式。在spring容器中我们能够通过类型,名称来进行be an的管理就是因为be an都是同一份。未来自己的开发中我们也能够进行开发。比如我们在做导入模块时就可以将公共部分进行抽象。具体部分由不同的实现类完成。最终我们通过享元完成内存管理