享元模式的应用场景
- 含义: 是对象池的一种实现,类似于线程池,可以避免不停的创建和销毁多个对象,消耗性能;
- 使用场景: 在系统有大量的相似对象,需要缓冲池的场景,一般会搭配工厂模式使用;
- 现实案例: 房源渠道、全国社保联网、线程池;
亨元的通用实现
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/91aee8a919694acae3cc67554f01b318.png)
- 接口Shape定义亨元被外部调用的方法
- 具体的亨元实现Circle实现接口Shape并实现自定义方法
- 工厂类ShapeFactory 在调用getCircle() 的时候从维护的HashMap(circleMap)中根据主键获取唯一身份标识的处理类,或者直接取出一个使用,使用完成之后归还处理对象;
与注册式单例的区分:
- 单例模式: 重点在创建单例,key为class,因此一个对象只能创建一次,
- 亨元模式: 重点在资源的重复利用,通常一个对象被多次创建,重复利用;
在源码中的使用:
- 案例1 ThreadPoolExecutor线程池
public class ThreadPoolExecutor extends AbstractExecutorService {
private static final int RUNNING = -1 << COUNT_BITS;
private static final int SHUTDOWN = 0 << COUNT_BITS;
private static final int STOP = 1 << COUNT_BITS;
private static final int TIDYING = 2 << COUNT_BITS;
private static final int TERMINATED = 3 << COUNT_BITS;
private final HashSet<Worker> workers = new HashSet<Worker>();
}
评估:
- 优点:减少对象创建,减少内存中对象的数量,降低系统的内存,提高效率;
- 缺点: 使得程序和逻辑变得复杂;内外部状态的分离,外部状态必须具体固有性质,不应该随着内部状态变化而变化;关注线程安全问题;