博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java设计优化-享元模式
阅读量:6915 次
发布时间:2019-06-27

本文共 2631 字,大约阅读时间需要 8 分钟。

享元模式是设计模式中少数几个以调高系统性能为目的的设计模式。它的核心思想是:如果在一个系统中存在多个相同的对象,那么只需共享一份对象的拷贝,而不必为每一次使用都创建新的对象。在享元模式中,由于需要构建和维护这些可以共享的对象,因此,常常会出现一个工厂类,用于维护和创建对象。

享元模式对性能提升的主要帮助有两点:

1.可以节省重复创建对象的开销,因为被享元模式维护的相同对象只会被创建一次,当对象创建比较耗时时,便可以节省大量时间;

2.由于创建对象的数量减少,所有对系统内存的需求也减少,这样使GC的压力也相应的降低,进而使系统拥有一个更健康的内存结构和更快的反应速度。

享元模式主要有享元工厂、抽象享元、具体享元和主函数几部分构成。各部分功能如下:

享元工厂是享元模式的核心,它需要确保系统可以共享相同的对象。享元模式的主要作用是复用大对虾(重量级对象),以减省内存空间和创建时间。享元模式的主要应用是SAAS系统(software as a service)。

抽象享元:

1 public interface IReportManager {2     public String createReport();3 }

具体享元:

1 public class EmployeeReportManager implements IReportManager { 2      3     private String tenantId = null; 4      5      6      7     public EmployeeReportManager(String tenantId) { 8         this.tenantId = tenantId; 9         System.out.println("EmployeeReportManager.EmployeeReportManager()");10     }11 12 13 14     @Override15     public String createReport() {16         return "This is a employee report";17     }18 19 }
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";    }                }

享元工厂:

1 public class ReportManagerFactory { 2     private Map
financialReportManager = new HashMap
(); 3 private Map
employeeReportManager = new HashMap
(); 4 5 public IReportManager getFinancialReportManager(String tenantId){ 6 IReportManager iReportManager = financialReportManager.get(tenantId); 7 if(iReportManager==null){ 8 iReportManager = new FinancialReportManager(tenantId); 9 }10 return iReportManager;11 }12 13 public IReportManager getEmployeeReportManager(String tenantId){14 IReportManager iReportManager = financialReportManager.get(tenantId);15 if(iReportManager==null){16 iReportManager = new FinancialReportManager(tenantId);17 }18 return iReportManager;19 }20 21 }

main方法:

1 public class TestClient { 2  3     public static void main(String[] args) { 4         ReportManagerFactory rmf = new ReportManagerFactory(); 5         IReportManager rm = rmf.getEmployeeReportManager("1233"); 6         rmf.getEmployeeReportManager("1233"); 7         System.out.println(rm.createReport()); 8     } 9 10 }

另外,享元模式与对象池最大的区别就是,享元模式是不可相互替代的,他们各自有各种的含义和用途,而对象池中的对象是等价的,可以相互替换,如数据库连接池中的数据库连接。

转载地址:http://ucacl.baihongyu.com/

你可能感兴趣的文章
javadoc的用法
查看>>
大地 Ghost Win7Sp1x86 装机版Y9.8
查看>>
Date的简单介绍
查看>>
Windows/Mac跑起XDAG源码
查看>>
C语言字符串操作函数
查看>>
富文本编辑器summernote使用
查看>>
马哥2016全新Linux+Python高端运维班第三周作业
查看>>
linux后台进程启动springboot
查看>>
Seo界神话 360好搜
查看>>
JavaScript闭包
查看>>
datatables服务器端分页
查看>>
用PL/SQL Developer导出表数据的时候,窗口一闪而过解决办法
查看>>
杨辉三角
查看>>
将 Log4j 配置文件放在项目外面
查看>>
nginx日志切割
查看>>
以太坊Dapp终极教程——如何构建一个完整的全栈去中心化应用(二)
查看>>
客户端bug测试贴
查看>>
java web 开发 编码问题详解
查看>>
python写的发邮件的小程序!
查看>>
Linux入门(四)
查看>>