享元设计模式

享元模式是一种创建型设计模式,用于降低大量相似对象的创建开销。通过共享不可变的内部状态,将外部状态通过参数传递,如数据库连接池中的连接对象复用。在Java中,Integer.valueOf()方法的实现也是享元模式的应用例子。
摘要由CSDN通过智能技术生成

享元设计模式


  1. 简单介绍

    享元模式是一种创建型设计模式。该模式旨在将对象的粒度细分,通过某种共享方式,将创建完成的对象重复利用。以此来降低创建对象时的开销,一定程度上也能节省内存资源。

  2. 使用场景

    程序中使用了大量相同类型的对象,这些对象在在创建时耗资源,并且占用空间较大,此种情况可以考虑使用享元模式。其次,当一个对象的大部分属性可以转换成外部状态属性,那么可以将外部状态属性抽取出来,通过传参的方式注入。将其余不可变属性作为内部状态封装到对象中,作为享元类,供程序共享使用。

  3. 场景举例

    从数据库连接池中获取数据库连接对象实例的方式,是典型的享元设计思想。数据库连接实例对象,在用完之后,可以放回“池”中(并不会进行销毁操作),等下个对象需要时,从“池”中获取,达到共享的效果,从而减少创建数据库连接所需要的开销。

  4. UML类图

    享元模式UML类图

  5. 具体实现

    • 描述

      • 以共享单车的运营模式来解释享元模式,其共性在于同一辆单车可供多个用户使用
      • AbstractSharedGoods:共享商品抽象类(抽象享元类),通过lease()租赁方法在传入外部状态,其中外部状态为该单车当前租户
      • SharedBicycle:共享单车(具体享元类),其内部状态是单车颜色(小黄车,小蓝车)
      • User:单车租借用户(享元类的外部状态)
    • 实现代码

    AbstractSharedGoods.java

    /**
     * 角色:Flyweight
     * 共享商品,即共享单车的抽象父类,外部状态为租用共享商品的用户
     */  
    public abstract class AbstractSharedGoods {
         
    
        /**
         * 共享单车租赁
         * @param user 租借共享单车的用户(外部状态)
         */
        public abstract void lease(User user);
    }
    

    SharedBicycle.java

    /**
     * 角色:具体享元类(ConcreteFlyweight)
     * 共享单车,不同的用户可以在共享使用同一辆单车
     */
    public class SharedBicycle extends AbstractSharedGoods {
         
    
        /**
         * 享元类的内部状态,即共享单车颜色
         * 对于同一辆单车来说其颜色是不会发生变化的
         * 内部状态不会随使用者的变化而变化
         * 常量,通过构造方法传入,实例化后,不在改变
         */
        private final String color;
    
        /**
         * 外部状态,不同的用户租借时,状态不同
         */
        private User user;
    
        @Override
        public void lease(User user) {
         
            this.user = user;
        }
    
        public SharedBicycle(String color<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
享元设计模式(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 对象,从而减少内存消耗。这在需要频繁加载和显示大量图片的应用中非常有用。 需要注意的是,享元模式适用于有大量相似对象的情况,并且需要权衡共享对象和创建对象的开销。在某些情况下,过度使用享元模式可能会导致代码复杂化,降低可读性和可维护性。因此,在使用享元模式时应根据实际情况进行评估和折衷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值