1 结构型模式之 - 享元模式
九路 201 6

享元模式的介绍

享元模式主要的作用就是可以对象共享,避免创建多对象。享元模式是对象池的一种实现,它的英文名字叫 Flyweight ,代表轻量级的意思。享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享,避免创建过多的对象的效果,这样一来可以提升性能,尽量减少内存的使用等。

享元模式的定义

使用共享对象池来缓存对象,如果有空闲的对象有拿来用,如果没有,新建一个放入池中,然后再返回使用。

享元模式的使用场景

  1. 系统中存在大量的相似对象
  2. 需要缓冲池的场景
  3. 消息队列中也有用到

下面以一个很简单的例子来介绍享元的用法。 首先需要有一个抽象的对象。也就是享元对象,如下:

 /**
  * 享元抽象对象
  */
 public abstract class Flyweight {
     protected abstract void doSomething();
 }

下面是具体的享元对象

/**
 * 具体的享元对象
 */
public class ConcreteFlyweight extends Flyweight{
    @Override
    protected void doSomething() {
        System.out.println("do something");
    }
}

享元模式的核心在于享元工厂类, 享元工厂类的作用在于提供一个用于存储享元对象的享元池, 用户需要对象时,首先从享元池中获取, 如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。


/**
 *
 *  享元模式的核心在于享元工厂类,
 *  享元工厂类的作用在于提供一个用于存储享元对象的享元池,
 *  用户需要对象时,首先从享元池中获取,
 *  如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。
 *
 */
public class FlyweightFactory {
    private HashMap<String,Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key){
        Flyweight flyweight = flyweights.get(key);

        //池中没有
        if(flyweight == null){
            //新建一个
            flyweight = new ConcreteFlyweight();
            //然后放入池中
            flyweights.put(key,flyweight);
        }

        //最后返回或者池中有,直接返回
        return flyweight;
    }
}

如上面的代码注释:如果有,直接返回,如果池中没有,新建一个享元对象,然后放入池中,再返回新建的对象。

这就是享元模式的思想,很简单,却很有用,Android中的消息机制就是这样的,有兴趣的可以看看android的Looper,Hander机制的源代码。

预览图
评论区

索引目录