概念:
享元模式:Use sharing to support large numbers of fine-gained object efficiently.使用享元模式可以有效地支持大量的细粒度额对象。这中英文翻译过来的定义,是不是看的一头雾水。简单来说就是结合工厂模式的对象池。看代码,其实倒不是很难。
实现:
享元对象(接口就定义了一个reader的方法,就不写了)
1 public class Book implements IBook { 2 public Book(String type){ 3 this.type = type; 4 } 5 6 private String type; 7 8 @Override 9 public void reader() { 10 System.out.println("我正在读"+type+"书"); 11 } 12 }
享元对象工厂
1 public class BookFactory { 2 private static Map<String,Book> pool = new HashMap<>(); 3 4 private BookFactory(){} 5 6 public static Book getBook(String type){ 7 Book book = pool.get(type); 8 if(book ==null){ 9 book = new Book(type); 10 pool.put(type,book); 11 } 12 return book; 13 } 14 }
分析:
1.很明显的特征,享元模式几乎和懒汉式单例相同,只是在内部添加了Map容器作为对象池存储对象
2.享元模式的适用范围,也就是为什么要加一个对象池,主要是用对象被高频率创建,对象生命周期又比较短,垃圾回收器还没来及的回收无用对象,造成无用对象大量占用内存空间,添加对象池的作用就反复使用同一对象。
3.很明显,享元模式使用的都是同一对象,所以在对享元模式对对象有修改操作时,多线程都有可能会出现问题,关于多线程使用享元模式也是需要注意的。