Android开发-设计模式-享元模式(Flyweight Pattern)

介绍

      享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态可以共享,外蕴状态不可以共享。内蕴状态和外蕴状态相互独立。

模式实现

  1. 单纯享元模式
  2. 复合享元模式

单纯享元模式

单纯享元模式有以下角色:

  • Flyweight(抽象享元),是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
  • ConcreteFlyweight(具体享元),实现抽象享元角色中所规定的接口。
  • Factory(享元工厂),负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。
  • Client(客户端),需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。

单纯享元模式结构图

在这里插入图片描述
(结构图来源于网上)

单纯享元模式实现

/**
 * 抽象享元
 */
abstract public class Flyweight {

    // 业务方法,参数state是外蕴状态(状态数据类型可以是其他,根据业务传入合适类型)
    abstract public void operation(String state);

}
/**
 * 具体享元
 */
public class ConcreteFlyweight extends Flyweight {

    // 内蕴状态(状态数据类型可以是其他,根据业务传入合适类型)
    private Character intrinsicState = null;

    // 内蕴状态作为参量传入
    public ConcreteFlyweight(Character state) {
        this.intrinsicState = state;
    }

    // 外蕴状态作为参量传入方法中,改变方法的行为,但是并不改变对象的内蕴状态(状态数据类型可以是其他,根据业务传入合适类型)。
    @Override
    public void operation(String state) {
        // 业务方法,根据实际业务编码
        System.out.println("Intrinsic State = "
                + intrinsicState
                + ", Extrinsic State = "
                + state);
    }
}
/**
 * 享元工厂
 */
public class FlyweightFactory {

    private final HashMap<Character, Flyweight> pool = new HashMap<>();

    public FlyweightFactory() {
    }

    // 内蕴状态作为参量传入
    public Flyweight factory(Character state) {
        if (pool.containsKey(state)) {
            return pool.get(state);
        } else {
            Flyweight fly = new ConcreteFlyweight(state);
            pool.put(state, fly);
            return fly;
        }
    }
}
/**
 * 客户端
 */
public class FlyweightClient {

    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight fly = null;

        fly = factory.factory(new Character('a'));
        fly.operation("First Call");

        fly = factory.factory(new Character('b'));
        fly.operation("Second Call");

        fly = factory.factory(new Character('c'));
        fly.operation("Third Call");
    }
}

复合享元模式

单纯享元模式有以下角色:

  • Flyweight(抽象享元),是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
  • ConcreteFlyweight(具体享元),实现抽象享元角色中所规定的接口。
  • UnsharedFlyweight(复合享元),复合享元角色所代表的对象是不可以共享的,但是一个复合享元对象可以分解成为多个本身是单纯享元对象的组合。复合享元角色又称做不可共享的享元对象。
  • Factory(享元工厂),负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。
  • Client(客户端),需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。

复合享元模式结构图

在这里插入图片描述
(结构图来源于网上)

复合享元模式实现

/**
 * 抽象享元
 */
abstract public class Flyweight {

    // 业务方法,参数state是外蕴状态(状态数据类型可以是其他,根据业务传入合适类型)
    abstract public void operation(String state);

}
/**
 * 具体享元
 */
public class ConcreteFlyweight extends Flyweight {

    // 内蕴状态(状态数据类型可以是其他,根据业务传入合适类型)
    private Character intrinsicState = null;

    // 内蕴状态作为参量传入
    public ConcreteFlyweight(Character state) {
        this.intrinsicState = state;
    }

    // 外蕴状态作为参量传入方法中,改变方法的行为,但是并不改变对象的内蕴状态(状态数据类型可以是其他,根据业务传入合适类型)。
    @Override
    public void operation(String state) {
        // 业务方法,根据实际业务编码
        System.out.println("Intrinsic State = "
                + intrinsicState
                + ", Extrinsic State = "
                + state);
    }
}
/**
 * 复合享元
 */
public class ConcreteCompositeFlyweight extends Flyweight {

    private final HashMap<Character, Flyweight> flies = new HashMap<>();

    public ConcreteCompositeFlyweight() {
    }

    public void add(Character key, Flyweight fly) {
        flies.put(key, fly);
    }

    @Override
    public void operation(String state) {
        Flyweight flyweight = null;
        Iterator<Map.Entry<Character, Flyweight>> iterator = flies.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<Character, Flyweight> e = iterator.next();
            flyweight = e.getValue();
            flyweight.operation(state);
        }
    }
}
/**
 1. 享元工厂
 */
public class FlyweightFactory {

    private final HashMap<Character, Flyweight> flies = new HashMap<>();

    public FlyweightFactory() {
    }

    // 单纯享元工厂方法,内蕴状态作为参量传入
    public Flyweight factory(Character state) {
        if (flies.containsKey(state)) {
            return flies.get(state);
        } else {
            Flyweight fly = new ConcreteFlyweight(state);
            flies.put(state, fly);
            return fly;
        }
    }

    // 复合享元工厂方法
    public Flyweight factory(List<Character> compositeStates) {
        ConcreteCompositeFlyweight compositeFlyweight = new ConcreteCompositeFlyweight();
        for (int i = 0; i < compositeStates.size(); i++) {
            Character state = compositeStates.get(i);
            compositeFlyweight.add(state, factory(state));
        }
        return compositeFlyweight;
    }
}

模式使用场景

  1. 一个系统有大量的对象。
  2. 这些对象耗费大量的内存。
  3. 这些对象的状态中的大部分可以外部化。
  4. 这些对象可以按照内蕴状态分成很多的组,当把外蕴对象从对象中剔除时,没一个组都可以仅用一个对象代替。
  5. 软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。

参考:
https://blog.csdn.net/justloveyou_/article/details/55045638
https://www.cnblogs.com/bastard/archive/2012/02/06/2340544.html
http://c.biancheng.net/view/1371.html

  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值