可以看到,每个颜色的圆形在第一次调用的时候都会缓存到共享池中,第二次调用的时候返回的对象是共享池中被创建好了的对象,只是修改了坐标(x, y) 属性而已,对象还是同一个。所以就做到了不用每次请求都去创建一个对象,即节省了内存的开支,也优化了程序的效率。
个人观点该模式在单线程下可以正常使用,一旦用在并发高的需求上可能会在客户端赋予外部状态的时候出现并发问题,所以该模式需要谨慎使用。
总结
在以下情况下可以使用享元模式
一个系统有大量相同或者相似的对象,由于这类对象的大量使用,造成内存的大量耗费;
对象的大部分状态都可以外部化,可以将这些外部状态传入对象中(细粒度对象);
使用享元模式需要维护一个存储享元对象的享元池,而这需要耗费资源,因此,应当在多次重复使用享元对象时才值得使用享元模式。
模式的优点
它可以极大减少内存中对象的数量,使得相同对象或相似对象在内存中只保存一份;
享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享。
模式的缺点
享元模式使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化;