享元模式是一種經常使用的設計模式。尤爲是在擁有大數據量的傳統後臺服務中尤其突出。咱們每每在不知不覺中就使用了這個設計模式。
先來看看享元模式的定義:
Flyweight Pattern Flyweight
譯爲: n. 次最輕量級的拳擊選手。 拳擊比賽的重量級、輕量級是經過選手的體重來分界的。
享元模式就是經過在程序中「緩存」進而達到「共享」厚重對象,是虛擬機的內存瘦身,減小消耗的設計模式。它可使一個本來應該很大型的數據服務進程儘量的瘦下來。這種設計模式相對於其它的模式在理念(思想)上有所差距。這主要體(防盜鏈接:本文首發自http://www.cnblogs.com/jilodream/ )如今,大部分的設計模式,都是創建在經過對象結構來實現總體架構的低內聚、高耦合。從而使業務在變動和擴展時,軟件系統能夠很容易的適應。而享元模式的主要目的則是爲了減小內存消耗,瘦身程序。這裏插句題外話,記得以前看過一本書中說過,若是說計算機世界中新創造了什麼劃時代的思想的話,那麼毫無疑問,就是緩存。
簡單點來講,享元模式其實就是對重對進行緩存管理。使得對象只(防盜鏈接:本文首發自http://www.cnblogs.com/jilodream/ )須要建立一次,各個依賴的地方使用的對象映射到內存中,都是同一塊地址的目的。 經過上邊對設計模式的描述,通過思考咱們能夠看出,在這個設計模式中,咱們須要用到三個元素: 設計模式
下面來舉一個具體的例子:
享元工廠
根據(防盜鏈接:本文首發自http://www.cnblogs.com/jilodream/ )ID建立、緩存、返回服務器實例
抽象享元類
銀行服務器:查帳、存款、轉帳、取款
具體享元類
工商銀行服務器
交通銀行服務器
建設銀行服務器
代碼實現:
享元工廠:緩存
1 public class BankServerMgr 2 { 3 private BankServerMgr() 4 { 5 } 6 7 private static final BankServerMgr instance = new BankServerMgr(); 8 9 public static BankServerMgr getInstance() 10 { 11 return instance; 12 } 13 14 private Map<String, IBankServer> bankServerCache = new HashMap<>(); 15 16 /** 17 * 根據ID獲取對應的銀行服務器實例 18 * 19 * @param bankID 20 * @return 21 */ 22 public synchronized IBankServer getBankServer(String bankID) 23 { 24 IBankServer bankServer = bankServerCache.get(bankID); 25 if (bankServer == null) 26 { 27 bankServer = createBankServerByID(bankID); 28 bankServerCache.put(bankID, bankServer); 29 } 30 return bankServer; 31 } 32 33 /** 34 * 根據銀行ID建立服務器實例 35 * 36 * @param bankID 37 * @return 38 */ 39 private IBankServer createBankServerByID(String bankID) 40 { 41 if ("ICBC".equals(bankID)) 42 { 43 return new ICBCServer(); 44 } 45 if ("BCM".equals(bankID)) 46 { 47 return new BCMServer(); 48 } 49 if ("CCB".equals(bankID)) 50 { 51 return new CCBServer(); 52 } 53 return null; 54 } 55 }
抽象享元類:服務器
1 public interface IBankServer 2 { 3 /** 4 * 查詢帳戶信息 5 * 6 * @return 7 */ 8 int checkAccount(); 9 10 /** 11 * 轉帳 12 * 13 * @return 14 */ 15 boolean transferAccount(int money, int accountID); 16 17 /** 18 * 存錢 19 * 20 * @return 21 */ 22 int saveMoney(int money); 23 24 /** 25 * 取錢 26 * 27 * @return 28 */ 29 int drawMoney(int money); 30 }
具體享元類架構
1 public class ICBCServer implements IBankServer 2 { 3 4 @Override 5 public int checkAccount() 6 { 7 // do sth in ICBC 8 return 0; 9 } 10 11 @Override 12 public boolean transferAccount(int money, int accountID) 13 { 14 // do sth in ICBC 15 return true; 16 } 17 18 @Override 19 public int saveMoney(int money) 20 { 21 // do sth in ICBC 22 return 0; 23 } 24 25 @Override 26 public int drawMoney(int money) 27 { 28 // do sth in ICBC 29 return 0; 30 } 31 32 }
1 public class BCMServer implements IBankServer 2 { 3 4 @Override 5 public int checkAccount() 6 { 7 // do sth in BCM 8 return 0; 9 } 10 11 @Override 12 public boolean transferAccount(int money, int accountID) 13 { 14 // do sth in BCM 15 return false; 16 } 17 18 @Override 19 public int saveMoney(int money) 20 { 21 // do sth in BCM 22 return 0; 23 } 24 25 @Override 26 public int drawMoney(int money) 27 { 28 // do sth in BCM 29 return 0; 30 } 31 }
1 public class CCBServer implements IBankServer 2 { 3 4 @Override 5 public int checkAccount() 6 { 7 // do sth in CCB 8 return 0; 9 } 10 11 @Override 12 public boolean transferAccount(int money, int accountID) 13 { 14 // do sth in CCB 15 return true; 16 } 17 18 @Override 19 public int saveMoney(int money) 20 { 21 // do sth in CCB 22 return 0; 23 } 24 25 @Override 26 public int drawMoney(int money) 27 { 28 // do sth in CCB 29 return 0; 30 } 31 32 }