设计模式之享元模式

享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。

适用场景

  1. 如果一个系统中存在大量的相同或者相似的对象,由于这类对象的大量使用,会造成系统内存的耗费,可以使用享元模式来减少系统中对象的数量。
  2. 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。

优点

  1. 享元模式的优点在于它能够极大的减少系统中对象的个数
  2. 享元模式由于使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享

缺点

  1. 由于享元模式需要区分外部状态和内部状态,使得应用程序在某种程度上来说更加复杂化了
  2. 为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长

UML结构图

设计模式之享元模式_第1张图片
Flyweight Pattern

]

源码

享元类的接口

public interface Flyweight {

    public void operation(int id);

}

具体共享类

public class ConcreteFlyweight implements Flyweight {

    @Override
    public void operation(int id) {
        System.out.println("具体Flyweight : " + id);
    }

}

不需要共享的享元具体实现类

public class UnsharedConcreteFlyweight implements Flyweight {

    @Override
    public void operation(int id) {
        System.out.println("不共享的具体Flyweight : " + id);
    }

}

享元工厂,用来创建并管理Flyweight对象。

public class FlyweightFactory {

    private HashMap flyweights = new HashMap();

    public FlyweightFactory() {
        flyweights.put("X", new ConcreteFlyweight());
        flyweights.put("Y", new ConcreteFlyweight());
        flyweights.put("Z", new ConcreteFlyweight());
    }

    public Flyweight getFlyweight(String key) {
        return flyweights.get(key);
    }
}

客户端调用

public class Client {

    public static void main(String[] args) {
        int id = 20;

        FlyweightFactory flyweightFactory = new FlyweightFactory();

        Flyweight fx = flyweightFactory.getFlyweight("X");
        fx.operation(--id);

        Flyweight fy = flyweightFactory.getFlyweight("Y");
        fy.operation(--id);

        Flyweight fz = flyweightFactory.getFlyweight("Z");
        fz.operation(--id);

        UnsharedConcreteFlyweight unsharedConcreteFlyweight = new UnsharedConcreteFlyweight();
        unsharedConcreteFlyweight.operation(--id);

    }

}

设计模式系列:

创建型 结构型 行为型
工厂方法
简单工厂
抽象工厂
建造者模式
单例模式
原型模式
组合模式
外观模式
桥接模式
代理模式
享元模式
适配器模式
装饰模式
策略模式
模板方法
状态模式
观察者模式
备忘录模式
迭代器模式
命令模式
职责链模式
解释器模式
访问者模式
中介者模式

你可能感兴趣的:(设计模式之享元模式)