设计模式之享元模式

享元模式是一种常用的设计模式。尤其是在拥有大数据量的传统后台服务中尤为突出。我们往往在不知不觉中就使用了这个设计模式。
先来看看享元模式的定义:
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 }

 

posted @ 2018-05-06 03:20  王若伊_恩赐解脱  阅读(742)  评论(0编辑  收藏  举报