成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

設計模式之對象池模式(Object Pool Pattern)

開發 前端
對象池模式(Object Pool Pattern),是創建型設計模式的一種,將對象預先創建并初始化后放入對象池中,對象提供者就能利用已有的對象來處理請求,減少頻繁創建對象所占用的內存空間和初始化時間。

[[437238]]

1 對象池模式的定義

對象池模式(Object Pool Pattern),是創建型設計模式的一種,將對象預先創建并初始化后放入對象池中,對象提供者就能利用已有的對象來處理請求,減少頻繁創建對象所占用的內存空間和初始化時間。一個對象池包含一組已經初始化并且可以使用的對象,可以在有需求時創建和銷毀對象。對象池的用戶可以從池子中取得對象,對其進行操作處理,并在不需要時歸還給池子而非直接銷毀。對象池是一個特殊的工廠對象,對象池模式就是單例模式加享元模式。

2 對象池模式的應用場景

對象池模式主要適用于以下應用場景。

(1)資源受限的場景。比如,不需要可伸縮性的環境(CPU\內存等物理資源有限),CPU性能不夠強勁,內存比較緊張,垃圾收集,內存抖動會造成比較大的影響,需要提高內存管理效率, 響應性比吞吐量更為重要。

(2)在內存中數量受限的對象。

(3)創建成本高的對象,可以考慮池化。

補充:常見的使用對象池的場景有在使用Socket時的各種連接池、線程池、數據庫連接池等。

3 對象池模式的UML類圖

對象池模式的UML類圖如下圖所示。

由上圖可以看到,對象池模式主要包含3個角色。

(1)對象池(ObjectPool):持有對象并提供取/還等方法。

(2)抽象池化對象(PooledObject):對池中對象的抽象。

(3)具體池化對象(ConcretePoolObject):對池中對象的封裝,封裝對象的狀態和一些其他信息。

4 對象池模式的通用寫法

以下是對象池模式的通用寫法。

  1. public class Client { 
  2.  
  3.     public static void main(String[] args) { 
  4.         ObjectPool pool = new ObjectPool(10,50); 
  5.         IPooledObject object = pool.borrowObject(); 
  6.         object.operation(); 
  7.         pool.returnObject(object); 
  8.         System.out.println(); 
  9.     } 
  10.  
  11.     //抽象對象 
  12.     interface IPooledObject { 
  13.         void operation(); 
  14.     } 
  15.     //具體對象 
  16.     static class ConcretePoolObject implements IPooledObject { 
  17.         public void operation() { 
  18.             System.out.println("doing"); 
  19.         } 
  20.     } 
  21.  
  22.     //對象池 
  23.     static class ObjectPool { 
  24.         private int step = 10;                      //當對象不夠用的時候,每次擴容的數量 
  25.         private int minCount; 
  26.         private int maxCount; 
  27.         private Vector<IPooledObject> returneds;     //保存未借出的對象 
  28.         private Vector<IPooledObject> borroweds;     //保存已被借出的對象 
  29.  
  30.         //初始化對象池 
  31.         public ObjectPool(int minCount,int maxCount){ 
  32.             borroweds = new Vector<IPooledObject>(); 
  33.             returneds = new Vector<IPooledObject>(); 
  34.  
  35.             this.minCount = minCount; 
  36.             this.maxCount = maxCount; 
  37.  
  38.             refresh(this.minCount); 
  39.         } 
  40.  
  41.         //因為內部狀態具備不變性,所以作為緩存的鍵 
  42.         public IPooledObject borrowObject() { 
  43.             IPooledObject next = null
  44.             if(returneds.size() > 0){ 
  45.                 Iterator<IPooledObject> i = returneds.iterator(); 
  46.                 while (i.hasNext()){ 
  47.                     next = i.next(); 
  48.                     returneds.remove(next); 
  49.                     borroweds.add(next); 
  50.                     return next
  51.                 } 
  52.             }else
  53.                 //計算出剩余可創建的對象數 
  54.                 int count = (maxCount - minCount); 
  55.                 //剩余可創建的數量大于單次固定創建的對象數 
  56.                 //則再初始化一批固定數量的對象 
  57.                 refresh(count > step ? step : count); 
  58.             } 
  59.             return next
  60.         } 
  61.  
  62.         //不需要使用的對象歸還重復利用 
  63.         public void returnObject(IPooledObject pooledObject){ 
  64.             returneds.add(pooledObject); 
  65.             if(borroweds.contains(pooledObject)){ 
  66.                 borroweds.remove(pooledObject); 
  67.             } 
  68.         } 
  69.  
  70.         private void refresh(int count){ 
  71.             for (int i = 0; i < count; i++) { 
  72.                 returneds.add(new ConcretePoolObject()); 
  73.             } 
  74.         } 
  75.     } 

對象池模式和享元模式的最大區別在于,對象池模式中會多一個回收對象重復利用的方法。所以,對象池模式應該是享元模式更加具體的一個應用場景。相當于先將對象從對象池中借出,用完之后再還回去,以此保證有限資源的重復利用。

5 對象池模式的優點

復用池中對象,消除創建對象、回收對象所產生的內存開銷、CPU開銷,以及跨網絡產生的網絡開銷。

6 對象池模式的缺點

(1)增加了分配/釋放對象的開銷。

(2)在并發環境中,多個線程可能(同時)需要獲取池中對象,進而需要在堆數據結構上進行同步或者因為鎖競爭而產生阻塞,這種開銷要比創建銷毀對象的開銷高數百倍。

(3)由于池中對象的數量有限,勢必成為一個可伸縮性瓶頸。

(4)很難合理設定對象池的大小,如果太小,則起不到作用;如果過大,則占用內存資源高。

 

責任編輯:姜華 來源: Tom彈架構
相關推薦

2021-12-01 07:38:27

設計模式規格模式Specificati

2019-08-16 10:46:46

JavaScript工廠模式抽象工廠模式

2013-05-23 15:59:00

線程池

2021-07-07 10:31:19

對象池模式解釋器模式設計模式

2020-08-21 07:23:50

工廠模式設計

2024-07-31 10:41:16

C#設計模式

2012-08-22 10:10:25

單態單態設計設計模式

2021-06-09 08:53:34

設計模式策略模式工廠模式

2012-02-29 09:41:14

JavaScript

2015-09-08 13:39:10

JavaScript設計模式

2021-06-16 08:56:06

模版方法模式設計模式行為型設計模式

2012-01-13 15:59:07

2023-09-04 13:14:00

裝飾器設計模式

2021-06-29 08:54:23

設計模式代理模式遠程代理

2021-12-24 07:50:45

責任鏈模式設計

2024-02-19 08:38:34

建造者模式Android設計模式

2024-04-16 00:07:36

設計模式代理模式替身

2010-03-25 08:52:30

PHP設計模式代理模式

2010-04-19 09:30:00

工廠模式PHP設計模式

2020-12-01 07:16:05

重學設計模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久小视频 | 日韩免费一区二区 | 色欧美片视频在线观看 | 欧美精品video| hsck成人网 | 色爱综合| 欧美日韩在线观看视频 | 国产欧美一级二级三级在线视频 | 伊人网一区 | 国产精品色一区二区三区 | www.成人免费视频 | 日韩欧美中文字幕在线观看 | 亚洲网一区 | 免费一级大片 | 色成人免费网站 | 国产线视频精品免费观看视频 | 中文天堂在线观看 | 999观看免费高清www | 久久av综合 | 伊人激情综合网 | 古装人性做爰av网站 | 日韩视频在线播放 | 国产一区 日韩 | 精品91久久| 亚洲欧美一区二区三区国产精品 | 在线一区二区三区 | 国产 日韩 欧美 在线 | 色综合久久久 | 国产午夜精品久久久 | 欧美激情综合 | 亚洲欧美日韩在线 | 国产精品欧美精品日韩精品 | 91成人免费看 | 欧美成年黄网站色视频 | 亚洲精品66| 亚洲不卡在线观看 | 国产精品区一区二区三 | 久久大| 日韩精彩视频 | 夜夜操天天干 | 91精品国产欧美一区二区 |