享元模式:运用共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类).
  适用环境:
  • 一个应用程序使用了大量的对象。
  • 完全由于使用大量的对象,造成很大的存储开销。
  • 对象的大多数状态都可变为外部状态。
  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值

    未命名44.bmp
    一个具体例子:
    它涉及到四个角色:
    抽象享元角色:此角色是所有具体享元类的超类,为这些类规定需要的接口,那些需要外蕴状态(External State)的操作可以调用商业的方法以参数方式传入。
    具体享元角色:实现抽象享元所规定的接口,如果有内蕴状态,则必须负责为内蕴提供存储空间。享元对象的内蕴状态必须与外部环境无关,从而使得享元对象在系统内共享。
    享元工厂角色:负责创建与管理享元角色。本角色必须保证享元对象可以在系统内适当共享.
    客户端角色:维护一个对所有享元对象的引用,需要自行存储所有享元对象的外蕴状态。 

    一个例子:
    抽象享元类

    package flyweight;

    public abstract class Flyweight{
        
    //state是一个外蕴状态
        public abstract void operation(String state);
    }
  • 具体享元类:
    package flyweight;

    public class ConcreteFlyweight extends Flyweight{
        
    private Character intrinsicState;
        
    //构造方法,内蕴作为参数传入
        public ConcreteFlyweight(Character intrinsicState){
            
    this.intrinsicState=intrinsicState;
        }

        
    //外蕴状态作为参数传入方法中,忙乱改变的是方法的行为
        public void operation(String state){
            System.out.println(
    "IntrinsicState:"+intrinsicState+" extrinsic state:"+state);
        }

        
    }
    享元工厂类:
    package flyweight;

    import java.util.*;

    public class FlyweightFactory{
        
    private HashMap files=new HashMap();

        
        
    public FlyweightFactory(){}
        
    //内蕴状态作为参数传入
        public Flyweight factory(Character state){
            
    if(files.containsKey(state))
                
    return (Flyweight)files.get(state);
            
    else
             
    {
                     Flyweight fly
    =new ConcreteFlyweight(state);
                     files.put(state,fly);
                     
    return fly;      
             }

        }

        
        
    public int getSize(){
            
    return files.size();
        }

    }
    客户类:
    package flyweight;

    public class FlyweightPattern{
        
    public static void main(String[] args){
            
            FlyweightFactory factory
    =new FlyweightFactory();
            Flyweight fly
    =factory.factory(new Character('a'));
            fly.operation(
    "first Call");
            fly
    =factory.factory(new Character('b'));
            fly.operation(
    "second Call");
            fly
    =factory.factory(new Character('a'));
            fly.operation(
    "Third Call");
            System.out.println(factory.getSize());
            
        }

    }
    运行结果:
    IntrinsicState:a extrinsic state:first Call
    IntrinsicState:b extrinsic state:second Call
    IntrinsicState:a extrinsic state:Third Call
    2
    Press any key to continue...

    参考资料:《Java与模式》
    《设计模式速查手册》
    http://blog.csdn.net/qutr/archive/2006/07/27/987233.aspx