设计模式之享元模式

内容预览:
  • 尤其是在拥有大数据量的传统后台服务中尤为突出~
  • 拳击比赛的重量级、轻量级是通过选手的体重来分界的~
  • 从而使业务在变更和扩展时,软件系统可以很容易的适应~

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

 

以上就是:设计模式之享元模式 的全部内容。

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢。
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论