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

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

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

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

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

享元工厂是享元模式的核心,它需要确保系统可以共享相同的对象。享元模式的主要作用是复用大对虾(重量级对象),以减省内存空间和创建时间。享元模式的主要应用是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设计优化-享元模式的更多相关文章

  1. JAVA设计模式之享元模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述享元(Flyweight)模式的: Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是 ...

  2. Java设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  3. 11.java设计模式之享元模式

    基本需求: 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同 每个客户要求发布的方式不一样,A要求以新闻的方式发布,B要求以博客的方 ...

  4. php 23种设计模型 - 享元模式

    享元模式 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...

  5. 由奶茶店突发奇想开始了Java设计模式:享元模式

    目录 定义 意图 主要解决问题 何时使用 优缺点 结构 奶茶摊位的例子 奶茶店的例子 在什么情况下使用享元模式 定义 享元模式是对象的结构模式,享元模式以共享的方式高效的支持大量的细粒度对象,主要用于 ...

  6. java设计优化--装饰者模式

    装饰者模式拥有一个设计非常巧妙的结构,它可以动态的添加功能.在基本的设计原则中,有一条重要的设计准则就是合成/聚合复用原则.根据该原则的思想,代码复用应该尽可能使用委托,而不是使用继承.因为继承是一种 ...

  7. 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  8. Flyweight(享元模式)

    import java.util.Hashtable; /** * 享元模式 * @author TMAC-J * 享元模式一般和工厂模式一起使用,但此处为了更好说明,只用享元模式 * 定义:享元模式 ...

  9. 设计模式-11享元模式(Flyweight Pattern)

    1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...

随机推荐

  1. Linux root 密码重置与用户管理

    ---forget root password restart your linux system press 'e' when start. press 'e' again then choose ...

  2. Programming ActionScript 3.0 for Flash

    http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ec ...

  3. selenium循环点击文本框

    1.可以用xpath循环点击checkbox List<WebElement> list = dr.findElements(By.className("datagrid-row ...

  4. ZBrush中的SubTool工具该怎样使用

    今天的ZBrush教程中将为大家引入一个新的工具SubTool,使用SubTool您可以添加PolyMesh至当前编辑的模型中,它的出现改变了过去ZBrush不能同时编辑多个模型的弊端. 查看详细的视 ...

  5. hdu-5495 LCS(置换)

    题目链接: LCS Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  6. 移动开发js库Zepto.js应用详解

    从哪里下载 Zepto 地址:http://zeptojs.com/ 中文版地址:http://www.css88.com/doc/zeptojs_api/ 这个问题看起来很蠢,从官网下载不就行了嘛! ...

  7. JavaScript Promise API

    同步编程通常来说易于调试和维护,然而,异步编程通常能获得更好的性能和更大的灵活性.异步的最大特点是无需等待."Promises"渐渐成为JavaScript里最重要的一部分,大量的 ...

  8. AppScan Source V8.8 中弃用的功能

    从 AppScan Source V8.8 开始,不再支持以下操作系统: Microsoft Windows XP Microsoft Windows Server 2003,所有版本和修订版   此 ...

  9. 优化mysql主从下的slave延迟问题

    一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以InnoDB引擎为主)完成事务提交的,而在slave上,复制 ...

  10. 谈谈redis主从复制的重点

    Redis主从复制的配置十分简单,它可以使从服务器是主服务器的完全拷贝.下面是关于Redis主从复制的几点重要内容: Redis使用异步复制.但从Redis 2.8开始,从服务器会周期性的应答从复制流 ...