java性能优化读书笔记之二《设计优化===享元模式》

来源:互联网 发布:c int数组默认值 编辑:程序博客网 时间:2024/05/18 03:53

1. 目的

减少相同对象实例化次数,从而省略创建对象所花费的时间以及内存空间,降低GC回收的压力。

2. 什么是享元

一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用都创建新的对象

3. 解决什么问题

相同的对象频繁地创建与销毁

4. 如何解决

享元工厂会维护一个对象列表,当任何组件尝试获取享元类时,如果请求的享元类已经存在,则直接fanh已有的享元类。若没有,则创建一个新的享元类

5. 何时使用

当您想控制相同对象的实例数目,节省系统资源的时候。

6. 好处

1、可以节省重复创建对象的开销
2、减少创建对象的数量,对系统内存的需求也减少了

7. 坏处

1、享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。
2、享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。

8. 角色分配

角色 作用 享元工厂 用于创建具体享元类,维护相同的享元对象。 抽象享元 定义享元对象处理业务的标准 具体享元 实现抽象享元的接口,实现某一种业务类型 使用者 使用享元对象

8. 代码清单

package com.one.design;import java.util.HashMap;import java.util.Map;/** * 模拟银行账户查询的功能 * 场景描述:银行账户去ATW账户查询余额,如果是同一个多次查询余额,账户对象(IAccountImpl) *          只需要实例化一次,当然,这种场景只是熟悉享元模式的用法 * @author Administrator * *//public class Flyweight {} /**  * 抽象享元  * @author Administrator  *  */ interface IAccount {     void queryBalance();} /**  * 抽象实现类  * @author Administrator  *  */ class  IAccountImpl implements IAccount {     private String name;     IAccountImpl(String name) {         this.name = name;     }    public void queryBalance() {        if("张三".equals(name)) {            System.out.println("acount be {}:"+name+",balance{}:100");            return;        } else if("李四".equals(name)){            System.out.println("acount be {}:"+name+",balance{}:200");            return;        }        System.out.println("acount is not exist!");    }} /**  *  享元对象维护工厂  * @author Administrator  *  */ class Accountfactory{     private Map<String, IAccountImpl> accountMap = new HashMap<String, IAccountImpl>();     public IAccountImpl getAccountImpl(String name) {         IAccountImpl iAccountImpl = accountMap.get(name);         if(iAccountImpl == null) {             iAccountImpl = new IAccountImpl(name);             accountMap.put(name, iAccountImpl);             return   iAccountImpl ;         }         return iAccountImpl;     }     /**      * 测试类      * @param args      */    public static void main(String[] args) {        Accountfactory accountfactory = new Accountfactory();        IAccountImpl accountImpl2 = accountfactory.getAccountImpl("张三");        IAccountImpl accountImpl3 = accountfactory.getAccountImpl("张三");        accountImpl2.queryBalance();        accountImpl3.queryBalance();        System.out.println((accountImpl2 == accountImpl3) );        IAccountImpl accountImpl4 = accountfactory.getAccountImpl("李四");        IAccountImpl accountImpl5 = accountfactory.getAccountImpl("李四");        accountImpl4.queryBalance();        accountImpl5.queryBalance();        System.out.println((accountImpl4 == accountImpl5) );    } }
0 0