设计模式(第十二式:享元模式)

概念:
  享元模式: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.很明显,享元模式使用的都是同一对象,所以在对享元模式对对象有修改操作时,多线程都有可能会出现问题,关于多线程使用享元模式也是需要注意的。




原文地址:https://www.cnblogs.com/ben-mario/p/11133082.html