设计模式之享元模式

享元模式

享元模式是设计模式中少数几个以提高系统性能为目的的模式,比比较简单。它的核心思想是:如果在系统存在多个相同的对象,那么只需要共享一份对象的拷贝即可,不必为每一次使用都创建新的对象。在这种模式中,由于需要构造和维护可以共享的对象,所以会出现一个工厂类,用于维护和创建对象。
享元模式对性能的提升主要在以下几个方面:
1.可以节省重复创建对象的开销,因为被享元模式维护的形同对象只会被创建一次,当创建对象比较耗时时,便可以节省大量时间。
2.由于创建的对象数量减少,所以对系统的内存占用也小,这使得GC压力也相对降低,从而使系统拥有一个更健康的内存结构和更快的反应速度。
享元模式主要有享元工厂、抽象享元、具体享元类和主函数构成。享元工厂用域创建具体的享元类,维护相同的享元对象。它保证相同的享元对象可以被系统共享,即其内部使用了类似于单例模式的算法,当主函数请求的对象已经在系统存在时,返回已创建对象,不存在时再创建对象。抽象享元时定义需共享的对象的业务接口。享元类时为了实现某些特定的业务逻辑,而抽象享元便定义了这些逻辑的语义行为。
享元工厂是享元模式的核心,它需要确保系统可以共享相同的对象。一般情况下,享元工厂都会维护一个对象列表,当任何组件尝试获取享元类时,如果请求的享元类已经被创建,则直接返回已有的享元类,若没有被创建,则创建一个新的享元对象,并将它加入到维护队列中。享元模式用的比较多的场景就是复用大对象也就是重量级对象,它占用的内存空间和创建时间都比较耗资源。
例如某SAAS运营厂商,支持多租户模式。甲乙两家公司都是该厂商的客户,每一个公司定义为一个租户。每个公司的员工都可以查看自己的收入情况,为了系统安全,每个租户都有自己独立的数据库。在这种情况下,可以使用享元模式为每个租户分别提供工资查询接口,而每一个公司下的所有员工都可以共享一个查询,这样有多少个租户就意味着有多少个享元实例。

package pdfdemo;
import java.util.HashMap;
import java.util.Map;
public class ReportManagerFactory {
      Map<String,IReportManager> financialReportManager = new HashMap<String,IReportManager>();
      public IReportManager getFinancialReportManager(String tenantId) {
    	  IReportManager r = financialReportManager.get(tenantId);
    	  if(r == null) {
    		  r = new FinancialReportManager(tenantId);
    		  financialReportManager.put(tenantId,r);
    	  }
    	  return r;
      }
}
package pdfdemo;
public class FinancialReportManager implements IReportManager{
    protected String tenantId = null;
    public FinancialReportManager(String tenantId) {
    	this.tenantId = tenantId;
    }
	@Override
	public String createReport() {
		// TODO Auto-generated method stub
		return "This is a financial report";
	}
}
package pdfdemo;
public interface IReportManager {
    public String createReport();
}

总结

享元模式看起来和线程池有点像,但线程池里面维护的线程对象都是等价的,没有任何差别。而享元工厂维护的对象列表是专属的、唯一的,不可互相替代,他们都有各自的定义和应用,这也是线程池和享元模式最大的差异。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
享元设计模式(Flyweight Design Pattern)是一种用于优化大量对象创建和使用的设计模式。在Android开发中,使用享元模式可以有效地减少内存消耗和提高性能。 在享元模式中,对象被分为两种状态:内部状态和外部状态。内部状态是不变的,可以被多个对象共享,而外部状态是可变的,每个对象都有自己的外部状态。 在Android中,典型的例子是使用Bitmap对象来显示图片。当需要显示多个相同的图片时,可以使用享元模式来共享已加载的Bitmap对象,而不是每次都创建新的Bitmap对象。 以下是一个简单的示例代码: ```java public class BitmapFactory { private Map<String, Bitmap> bitmapCache = new HashMap<>(); public Bitmap getBitmap(String path) { Bitmap bitmap = bitmapCache.get(path); if (bitmap == null) { // 如果缓存中没有该Bitmap对象,则创建新的Bitmap对象 bitmap = BitmapFactory.decodeFile(path); bitmapCache.put(path, bitmap); } return bitmap; } } ``` 在上面的示例中,`BitmapFactory` 类使用一个 `bitmapCache` Map 来缓存已加载的 Bitmap 对象。当需要获取 Bitmap 对象时,首先从缓存中查找,如果找到则返回缓存的对象,否则创建新的 Bitmap 对象并存入缓存。 通过使用享元模式,可以避免重复创建相同的 Bitmap 对象,从而减少内存消耗。这在需要频繁加载和显示大量图片的应用中非常有用。 需要注意的是,享元模式适用于有大量相似对象的情况,并且需要权衡共享对象和创建对象的开销。在某些情况下,过度使用享元模式可能会导致代码复杂化,降低可读性和可维护性。因此,在使用享元模式时应根据实际情况进行评估和折衷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny_daily

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值