设计模式-享元模式

1.UML类图

设计模式-享元模式_第1张图片

FlyweightFactory是一个享元工厂,用来创建并管理Flyweight对象。它主要是用来确保合理地共享Flywight,当用户请求一个Flywight时,FlyweightFactory对象提供一个已经创建好的实例或者创建一个,如果实例不存在的化话。Flyweight是所有享元类的超类或者接口,通过这个接口,Flyweight可以接受并作用于外部状态。ConcreteFlyweight继承Flyweight超类或者实现Flyweight接口,并为内部状态增加存储空间。UnsharedConcreteFlyweight指那些不需要共享的Flyweight子类,因为Flyweight接口使共享成为可能,但它并不强制共享。

2.示例代码

public abstract class Flyweight {
    public abstract void operation(int number);

}

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

}

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

}

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 (Flyweight) flyweights.get(key);
    }

}

public class Client {
    public static void main(String[] args) {
        int number = 22;
        FlyweightFactory flyweightFactory = new FlyweightFactory();

        Flyweight fx = flyweightFactory.getFlyweight("x");
        fx.operation(--number);

        Flyweight fy = flyweightFactory.getFlyweight("y");
        fy.operation(--number);

        Flyweight fz = flyweightFactory.getFlyweight("z");
        fz.operation(--number);

        Flyweight uf = new UnsharedConcreteFlyweight();
        uf.operation(--number);
    }

}

3.特点

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

(2)在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态,而随环境改变而改变的、不可以共享的状态就是外部状态了,比如用户对于网站来说就是外部状态。享元模式可以避免大量非常相似类的开销。在程序设计过程中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本都是相同的,有时就能受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。

(3)如果一个应用使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以是外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

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