享元模式的介绍:享元模式主要的作用就是可以对象共享,避免创建多对象。享元模式是对象池的一种实现,它的英文名字叫 Flyweight ,代表轻量级的意思。享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享,避免创建过多的对象的效果,这样一来可以提升性能,尽量减少内存的使用等。
享元模式的定义:使用共享对象池来缓存对象,如果有空闲的对象有拿来用,如果没有,新建一个放入池中,然后再返回使用。
享元模式的使用场景:
1 系统中存在大量的相似对象
2 需要缓冲池的场景
3 消息队列中也有用到
下面以一个很简单的例子来介绍享元的用法。
首先需要有一个抽象的对象。也就是享元对象,如下:
1 /** 2 * 享元抽象对象 3 */ 4 public abstract class Flyweight { 5 protected abstract void doSomething(); 6 }
下面是具体的享元对象
1 /** 2 * 具体的享元对象 3 */ 4 public class ConcreteFlyweight extends Flyweight{ 5 @Override 6 protected void doSomething() { 7 System.out.println("do something"); 8 } 9 }
享元模式的核心在于享元工厂类,
享元工厂类的作用在于提供一个用于存储享元对象的享元池,
用户需要对象时,首先从享元池中获取,
如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。
1 /** 2 * 3 * 享元模式的核心在于享元工厂类, 4 * 享元工厂类的作用在于提供一个用于存储享元对象的享元池, 5 * 用户需要对象时,首先从享元池中获取, 6 * 如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。 7 * 8 */ 9 public class FlyweightFactory { 10 private HashMap<String,Flyweight> flyweights = new HashMap<>(); 11 12 public Flyweight getFlyweight(String key){ 13 Flyweight flyweight = flyweights.get(key); 14 15 //池中没有 16 if(flyweight == null){ 17 //新建一个 18 flyweight = new ConcreteFlyweight(); 19 //然后放入池中 20 flyweights.put(key,flyweight); 21 } 22 23 //最后返回或者池中有,直接返回 24 return flyweight; 25 } 26 }
如上面的代码注释:如果有,直接返回,如果池中没有,新建一个享元对象,然后放入池中,再返回新建的对象。
这就是享元模式的思想,很简单,却很有用,Android中的消息机制就是这样的,有兴趣的可以看看android的Looper,Hander机制的源代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通