Flyweight模式

Flyweight模式定义

避免大量拥有相同内容的小类开销,使大家共享一个类。

为什么使用?

面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个对象,几千个字,对象就是几千,无疑耗费内存,那么我们还是要求同存异,找出这些对象群得共同点,设计一个元类,封装可以被共享的类,另外,还有一些特性是取决于应用,是不可共享的,这也是Flyweight中两个重要概念内部状态和外部状态之分Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。

如何使用?

我们先从Flyweight抽象接口开始:

public interface Flyweight
{
    public void operation();
}
//抽象数据类型
public interface ExtrinsicState
{

}
public interface IntrinsicState
{

}

下面是接口的具体实现,并为内部状态添加内存空间,ConcreteFlyweight必须是可共享的,它保存的任何状态都必须是内部的,也就是说它必须和它的应用场景无关。

public class ConcreteFlyweight implements Flyweight
{
    private IntrinsicState state;

    public void operation(ExtrinsicState state)
    {

    }
}

当然,并不是所有的Flyweight具体实现子类都需要被共享的,所以还有另外一种不共享的ConcreteFlyweight:

public class UnsharedConcreteFlyweight implements Flyweight
{
    public void operation(ExtrinsicState state)
    {

    }
}

FlyweightFactory负责维护一个Flyweight池(存放内部状态),当客户端请求一个共享Flyweight时,这个factory首先搜索池中是否已经有可适用,如果有,factory只是简单返回送出这个对象,否则,创建一个新的对象,加入到池中,再返回送出这个对象:

pubic class FlyweightFactory
{
    private HashTable flyweights = new HashTable();

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

        if(null == flyweight)
        {
            flyweight = new ConcereteFlyweight();

            flyweights.put(key,flyweight);
        }

        return flyweight;
    }
}

Flyweight模式的基本框架已经就绪,我们看看如何调用:

FlyweightFactory factory = new FlyweightFactory();

Fleyweight fly1 = factory .getFlyweight("Fred");
Fleyweight fly2 = factory .getFlyweight("W");

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