享元模式

享元(Flyweight)模式的定义:运用共享技术来有効地支持大量细粒度对象的复用。

享元模式的主要优点是:相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。

其主要缺点是:
为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。
读取享元模式的外部状态会使得运行时间稍微变长。

/**
* 抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
* 具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。
* 非享元(Unsharable Flyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。
* 享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。
**/
public class FlyweightPattern {
  public static void main(String[] args) {
    FlyweightFactory factory=new FlyweightFactory();
    Flyweight f01=factory.getFlyweight("a");
    Flyweight f02=factory.getFlyweight("a");
    Flyweight f03=factory.getFlyweight("a");
    Flyweight f11=factory.getFlyweight("b");
    Flyweight f12=factory.getFlyweight("b");       
    f01.operation(new UnsharedConcreteFlyweight("第1次调用a。"));       
    f02.operation(new UnsharedConcreteFlyweight("第2次调用a。"));       
    f03.operation(new UnsharedConcreteFlyweight("第3次调用a。"));       
    f11.operation(new UnsharedConcreteFlyweight("第1次调用b。"));       
    f12.operation(new UnsharedConcreteFlyweight("第2次调用b。"));
  }
}
/**
* 非享元角色
**/
class UnsharedConcreteFlyweight {
  private String info;
  public UnsharedConcreteFlyweight (String info) {
    this.info = info;
  }
  public String getInfo() {
    return this.info;
   }
  public void setInfo(String info) {
    this.info = info;
  }
}
/**
* 抽象享元角色
**/
interface Flyweight {
  public void operation(UnsharedConcreteFlyweight state);
}
/**
* 具体享元角色
**/
class ConcreteFlyweight implements Flyweight {
  private String key;
  ConcreteFlyweight(String key) {
    this.key = key;
    System.out.println("具体享元"+key+"被创建!");
  }
  public void operation(UnsharedConcreteFlyweight outState) {
    System.out.print("具体享元"+key+"被调用,");
    System.out.println("非享元信息是:"+outState.getInfo());
  }
}
/**
* 享元工厂角色
**/
class FlyweightFactory {
  private HashMap flyweights = new HashMap();
  public Flyweight getFlyweight(String key) {
    Flyweight flyweight = (Flyweight)flyweights.get(key);
    if (flyweight != null) {
      System.out.println("具体享元"+key+"已经存在,被成功获取!");
    } else {
      flyweight = new ConcreteFlyweight(key);
      flyweights.put(key, flyweight);
    }
    return flyweight;
  }
}

上一篇:外观模式
下一篇:组合模式
腾讯云双十一优惠链接

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