设计模式之享元模式
享元模式是一种常用的设计模式。尤其是在拥有大数据量的传统后台服务中尤为突出。我们往往在不知不觉中就使用了这个设计模式。
先来看看享元模式的定义:
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 }
如果你觉得写的不错,欢迎转载和点赞。 转载时请保留作者署名jilodream/王若伊_恩赐解脱(博客链接:http://www.cnblogs.com/jilodream/