確保物件的唯一性——單例模式 (二)
3.3 負載均衡器的設計與實現
Sunny軟體公司承接了一個伺服器負載均衡(Load Balance)軟體的開發工作,該軟體執行在一臺負載均衡伺服器上,可以將併發訪問和資料流量分發到伺服器叢集中的多臺裝置上進行併發處理,提高系統的整體處理能力,縮短響應時間。由於叢集中的伺服器需要動態刪減,且客戶端請求需要統一分發,因此需要確保負載均衡器的唯一性,只能有一個負載均衡器來負責伺服器的管理和請求的分發,否則將會帶來伺服器狀態的不一致以及請求分配衝突等問題。如何確保負載均衡器的唯一性是該軟體成功的關鍵。 |
Sunny公司開發人員通過分析和權衡,決定使用單例模式來設計該負載均衡器,結構圖如圖3-3所示:
在圖3-3中,將負載均衡器LoadBalancer設計為單例類,其中包含一個儲存伺服器資訊的集合serverList,每次在serverList中隨機選擇一臺伺服器來響應客戶端的請求,實現程式碼如下所示:
import java.util.*;
//負載均衡器LoadBalancer:單例類,真實環境下該類將非常複雜,包括大量初始化的工作和業務方法,考慮到程式碼的可讀性和易理解性,只列出部分與模式相關的核心程式碼
class LoadBalancer {
//私有靜態成員變數,儲存唯一例項
private static LoadBalancer instance = null;
//伺服器集合
private List serverList = null;
//私有建構函式
private LoadBalancer() {
serverList = new ArrayList();
}
//公有靜態成員方法,返回唯一例項
public static LoadBalancer getLoadBalancer() {
if (instance == null) {
instance = new LoadBalancer();
}
return instance;
}
//增加伺服器
public void addServer(String server) {
serverList.add(server);
}
//刪除伺服器
public void removeServer(String server) {
serverList.remove(server);
}
//使用Random類隨機獲取伺服器
public String getServer() {
Random random = new Random();
int i = random.nextInt(serverList.size());
return (String)serverList.get(i);
}
}
編寫如下客戶端測試程式碼:
class Client {
public static void main(String args[]) {
//建立四個LoadBalancer物件
LoadBalancer balancer1,balancer2,balancer3,balancer4;
balancer1 = LoadBalancer.getLoadBalancer();
balancer2 = LoadBalancer.getLoadBalancer();
balancer3 = LoadBalancer.getLoadBalancer();
balancer4 = LoadBalancer.getLoadBalancer();
//判斷伺服器負載均衡器是否相同
if (balancer1 == balancer2 && balancer2 == balancer3 && balancer3 == balancer4) {
System.out.println("伺服器負載均衡器具有唯一性!");
}
//增加伺服器
balancer1.addServer("Server 1");
balancer1.addServer("Server 2");
balancer1.addServer("Server 3");
balancer1.addServer("Server 4");
//模擬客戶端請求的分發
for (int i = 0; i < 10; i++) {
String server = balancer1.getServer();
System.out.println("分發請求至伺服器: " + server);
}
}
}
編譯並執行程式,輸出結果如下:
伺服器負載均衡器具有唯一性! 分發請求至伺服器: Server 1 分發請求至伺服器: Server 3 分發請求至伺服器: Server 4 分發請求至伺服器: Server 2 分發請求至伺服器: Server 3 分發請求至伺服器: Server 2 分發請求至伺服器: Server 3 分發請求至伺服器: Server 4 分發請求至伺服器: Server 4 分發請求至伺服器: Server 1 |
雖然建立了四個LoadBalancer物件,但是它們實際上是同一個物件,因此,通過使用單例模式可以確保LoadBalancer物件的唯一性。
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 確保物件的唯一性——單例模式 (五)物件單例模式
- 確保物件的唯一性——單例模式 (四)物件單例模式
- 確保物件的唯一性——單例模式 (三)物件單例模式
- 設計模式系列之單例模式(Singleton Pattern)——確保物件的唯一性設計模式單例物件
- 確保您擁有一個獨一無二的例項:單例模式的建立方式單例模式
- 單例模式的正確寫法單例模式
- 【指令碼】如何確保應用程式的唯一性指令碼
- 單例模式 - 確定 N 先生的GrilFriend單例模式
- 設計模式(二)——單例模式設計模式單例
- jS設計模式二:單例模式JS設計模式單例
- JS設計模式(二)--- 單例模式JS設計模式單例
- 如何正確地寫出單例模式單例模式
- Singleton(單例)——物件建立型模式單例物件模式
- 設計模式之“物件效能模式”: Singleton 單例模式(筆記)設計模式物件單例筆記
- java23種設計模式—— 二、單例模式Java設計模式單例
- 您的單例模式,真的單例嗎?單例模式
- Android 常用設計模式(二) -- 單例模式(詳解)Android設計模式單例
- JAVA物件導向高階:static的應用知識--單例模式 單例設計模式應用場景及好處 單例設計模式的實現方式Java物件單例設計模式
- 單例模式單例模式
- iOS單例物件iOS單例物件
- JS中的單例模式及單例模式原型類的實現JS單例模式原型
- DCL單例模式中的缺陷及單例模式的其他實現單例模式
- 【極客思考】設計模式:你確定你真的理解了單例模式嗎?設計模式單例
- Scala單例物件、伴生物件單例物件
- 單例模式(下)---聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) - 聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) – 聊一聊單例模式的幾種寫法單例模式
- Flutter 中的單例模式Flutter單例模式
- Flutter(able) 的單例模式Flutter單例模式
- 單例模式的實現單例模式
- javascript單例模式的理解JavaScript單例模式
- 單例模式static的困惑單例模式
- 物件的克隆——原型模式(二)物件原型模式
- Unity3d遊戲開發之-單例設計模式-單例模式二:多執行緒二(雙重鎖定)Unity3D遊戲開發單例設計模式執行緒
- 設計模式-單例模式設計模式單例
- [設計模式] 單例模式設計模式單例
- 設計模式 —— 單例模式設計模式單例
- 設計模式(單例模式)設計模式單例