java设计优化-享元模式
2015-11-23 23:45
513 查看
享元模式是设计模式中少数几个以调高系统性能为目的的设计模式。它的核心思想是:如果在一个系统中存在多个相同的对象,那么只需共享一份对象的拷贝,而不必为每一次使用都创建新的对象。在享元模式中,由于需要构建和维护这些可以共享的对象,因此,常常会出现一个工厂类,用于维护和创建对象。
享元模式对性能提升的主要帮助有两点:
1.可以节省重复创建对象的开销,因为被享元模式维护的相同对象只会被创建一次,当对象创建比较耗时时,便可以节省大量时间;
2.由于创建对象的数量减少,所有对系统内存的需求也减少,这样使GC的压力也相应的降低,进而使系统拥有一个更健康的内存结构和更快的反应速度。
享元模式主要有享元工厂、抽象享元、具体享元和主函数几部分构成。各部分功能如下:
![](http://images2015.cnblogs.com/blog/805129/201511/805129-20151123233217952-1901722502.png)
享元工厂是享元模式的核心,它需要确保系统可以共享相同的对象。享元模式的主要作用是复用大对虾(重量级对象),以减省内存空间和创建时间。享元模式的主要应用是SAAS系统(software as a service)。
抽象享元:
具体享元:
享元工厂:
main方法:
另外,享元模式与对象池最大的区别就是,享元模式是不可相互替代的,他们各自有各种的含义和用途,而对象池中的对象是等价的,可以相互替换,如数据库连接池中的数据库连接。
享元模式对性能提升的主要帮助有两点:
1.可以节省重复创建对象的开销,因为被享元模式维护的相同对象只会被创建一次,当对象创建比较耗时时,便可以节省大量时间;
2.由于创建对象的数量减少,所有对系统内存的需求也减少,这样使GC的压力也相应的降低,进而使系统拥有一个更健康的内存结构和更快的反应速度。
享元模式主要有享元工厂、抽象享元、具体享元和主函数几部分构成。各部分功能如下:
![](http://images2015.cnblogs.com/blog/805129/201511/805129-20151123233217952-1901722502.png)
享元工厂是享元模式的核心,它需要确保系统可以共享相同的对象。享元模式的主要作用是复用大对虾(重量级对象),以减省内存空间和创建时间。享元模式的主要应用是SAAS系统(software as a service)。
抽象享元:
public interface IReportManager { public String createReport(); }
具体享元:
public class EmployeeReportManager implements IReportManager { private String tenantId = null; public EmployeeReportManager(String tenantId) { this.tenantId = tenantId; System.out.println("EmployeeReportManager.EmployeeReportManager()"); } @Override public String createReport() { return "This is a employee report"; } }
public class FinancialReportManager implements IReportManager{ private String tenantId = null; public FinancialReportManager(String tenantId) { this.tenantId = tenantId; System.out.println("FinancialReportManager.FinancialReportManager()"); } @Override public String createReport() { return "This is a financial report"; } }
享元工厂:
public class ReportManagerFactory { private Map<String,IReportManager> financialReportManager = new HashMap<String,IReportManager>(); private Map<String,IReportManager> employeeReportManager = new HashMap<String,IReportManager>(); public IReportManager getFinancialReportManager(String tenantId){ IReportManager iReportManager = financialReportManager.get(tenantId); if(iReportManager==null){ iReportManager = new FinancialReportManager(tenantId); } return iReportManager; } public IReportManager getEmployeeReportManager(String tenantId){ IReportManager iReportManager = financialReportManager.get(tenantId); if(iReportManager==null){ iReportManager = new FinancialReportManager(tenantId); } return iReportManager; } }
main方法:
public class TestClient { public static void main(String[] args) { ReportManagerFactory rmf = new ReportManagerFactory(); IReportManager rm = rmf.getEmployeeReportManager("1233"); rmf.getEmployeeReportManager("1233"); System.out.println(rm.createReport()); } }
另外,享元模式与对象池最大的区别就是,享元模式是不可相互替代的,他们各自有各种的含义和用途,而对象池中的对象是等价的,可以相互替换,如数据库连接池中的数据库连接。
相关文章推荐
- java设计模式(二)—观察者模式
- Java XML解析
- springMVC中相关注解
- 第一个spring冲刺总结
- mac安装/升级java并配置环境变量
- SpringMVC配置
- Java开源在线商城系统 ostocy-jshop
- JAVA服务端的解码
- Spring进阶运用
- java中HashSet实现(转)
- java冒泡排序简易版
- Java获取当前类路径
- 15-11-23 java运算的一些细节
- Java获取当前类路径
- Java获取当前类路径
- java泛型简单学习
- java 静态方法和实例方法的区别
- 现在的大学生啊~[偶遇一奇葩应届java猿]
- Java并发编程:Lock
- org.springframework.web.util.IntrospectorCleanupListener