设计模式之享元模式【Flyweight Pattern】

享元模式是对象池的一种实现,用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享、避免创建过多对象的效果。可以提升性能。避免内存移除等。

1、定义

使用共享对象可有效地支持大量的细粒度的对象。

2、使用场景

  1. 系统中存在大量相似对象。
  2. 细粒度的对象都具备较接近的外部状态,并且内部状态与环境无关。
  3. 需要缓冲池的场景。

3、UML图

4、代码示例

享元类定义

public interface Flyweight {

    // 示意性方法,参数state是外部状态
    public void doSomething(String externalState);
}

public class ConcreteFlyweight implements Flyweight {

    //内部状态,初始化后就不变了
    private String intrinsicState = null;

    /**
     * 构造函数,内部状态作为参数传入
     * 
     * @param state
     */
    public ConcreteFlyweight(String state) {
        this.intrinsicState = state;
    }

    /**
     * 外部状态作为参数传入方法中,改变方法的行为, 但是并不改变对象的内部状态。
     */
    @Override
    public void doSomething(String externalState) {
        //具体的功能逻辑,可能会用到享元内部、外部状态
        System.out.println("Intrinsic State = " + this.intrinsicState);
        System.out.println("External State = " + externalState);
    }
}

享元工厂:

public class FlyweightFactory {

    private Map<String, Flyweight> maps = new HashMap<String, Flyweight>();

    public Flyweight getFlyweight(String state) {

        // 1、先从缓存中查找对象
        Flyweight fly = maps.get(state);

        // 2、如果对象不存在则创建一个新的享元对象
        if (fly == null) {
            System.out.println("享元对象池没有,新创建一个对象");
            fly = new ConcreteFlyweight(state);
            // 2.1、 把这个新的享元对象添加到缓存中
            maps.put(state, fly);
        } else {
            System.out.println("在享元对象池找到缓存对象,直接返回");
        }
        // 3、返回享元对象
        return fly;
    }
}

客户端调用:

public class Client {

    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight fly = factory.getFlyweight("男的");
        fly.doSomething("写代码");

        System.out.print("\n");

        fly = factory.getFlyweight("女的");
        fly.doSomething("做美工图片");

        System.out.print("\n");

        fly = factory.getFlyweight("男的");
        fly.doSomething("修电脑");
    }
}

调用输出:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/iluojie/article/details/80400105