zoukankan      html  css  js  c++  java
  • java设计优化-享元模式

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

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

    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     @Override
    15     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<String,IReportManager> financialReportManager = new HashMap<String,IReportManager>();
     3     private Map<String,IReportManager> employeeReportManager = new HashMap<String,IReportManager>();
     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 }

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

  • 相关阅读:
    记第一次为开源代码报漏洞
    入职第三周——总结前两周学习内容
    入职一星期之感想
    毕业季之礼
    基于mint-ui的移动应用开发案例二(项目搭建)
    基于mint-ui的移动应用开发案例一(简介)
    工作笔记一——杂项
    微信小程序实战小小应用——豆瓣电影
    React学习之坑(二)- 基础入门
    React学习笔记(一)- 环境搭建
  • 原文地址:https://www.cnblogs.com/lcngu/p/4990133.html
Copyright © 2011-2022 走看看