Flyweight设计模式,以创建共享对象池

时间:2013-11-26 08:10:37

标签: java design-patterns

我正在尝试了解 Flyweight设计模式如何有效地用于创建共享对象池。出现的要求是由于基于Java EE Web的应用程序的性能改进核对表。

对于频繁使用的复杂对象,我考虑使用可循环使用的对象池,而不是总是实例化新对象。

现在请告诉我如何使用flyweight设计模式来创建有价值的系统资源池 - 线程 - 数据库连接 - 套接字连接等。

1 个答案:

答案 0 :(得分:3)

对于资源池,您需要:

  • 池化资源(可以是数组或资源集合)
  • 一种创建资源的方式(可以是所有资源的预先创建,也可以是按需创建懒惰)
  • 保护对资源的访问。当不再需要资源时,必须获取已发布。当所有资源都被占用时,尝试获取资源必须阻止,直到资源被释放。

aquire-release部分可以使用Semaphore实现,其中池大小是信号量上的许可数。如果你关注the link to the JavaDoc,那么已经有了这样一个池的例子:

(来自JavaDoc的代码)

class Pool {
   private static final int MAX_AVAILABLE = 100;
   private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);

   public Object getItem() throws InterruptedException {
     available.acquire();
     return getNextAvailableItem();
   }

   public void putItem(Object x) {
     if (markAsUnused(x))
       available.release();
   }

   // Not a particularly efficient data structure; just for demo

   protected Object[] items = ... whatever kinds of items being managed
   protected boolean[] used = new boolean[MAX_AVAILABLE];

   protected synchronized Object getNextAvailableItem() {
     for (int i = 0; i < MAX_AVAILABLE; ++i) {
       if (!used[i]) {
          used[i] = true;
          return items[i];
       }
     }
     return null; // not reached
   }

   protected synchronized boolean markAsUnused(Object item) {
     for (int i = 0; i < MAX_AVAILABLE; ++i) {
       if (item == items[i]) {
          if (used[i]) {
            used[i] = false;
            return true;
          } else
            return false;
       }
     }
     return false;
   }

 }