• 设计模式之享元模式


    享元模式是一种常用的设计模式。尤其是在拥有大数据量的传统后台服务中尤为突出。我们往往在不知不觉中就使用了这个设计模式。
    先来看看享元模式的定义:
    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 }
  • 相关阅读:
    C#代码也VB
    Flash/Flex学习笔记(9):ActionScript3.0与Javascript的相互调用
    原来Silverlight 4中是可以玩UDP的!
    Flash/Flex学习笔记(20):贝塞尔曲线
    Flash/Flex学习笔记(16):如何做自定义Loading加载其它swf
    AS3:让人叹为观止的Flash作品
    Flash/Flex学习笔记(10):FMS 3.5之Hello World!
    Flash/Flex学习笔记(12):FMS 3.5之如何做视频实时直播
    Flash/Flex学习笔记(28):动态文本的滚动控制
    Flash/Flex学习笔记(18):画线及三角函数的基本使用
  • 原文地址:https://www.cnblogs.com/jilodream/p/8997059.html
Copyright © 2020-2023  润新知