設計模式之享元模式

享元模式是一種經常使用的設計模式。尤爲是在擁有大數據量的傳統後臺服務中尤其突出。咱們每每在不知不覺中就使用了這個設計模式。
先來看看享元模式的定義:
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 }
相關文章
相關標籤/搜索