<<设计模式之禅(第二版)>>——第二十

2016-10-23  本文已影响15人  leiiiooo
定义:

将对象信息划分为: 内部状态(intrinsic)、外部状态(extrinsic)

内部状态:内部状态是对象可以共享出来的信息,存储在享元对象内部并且不会随环境改变而改变,它们可以作为一个对象的动态附加信息,不必直接存储在某个具体对象中,属于可以共享的部分。

外部状态:是对象得以依赖的一个标记,是随环境改变而改变的、不可以共享的状态,他是一批对象的统一标识,是唯一的一个索引值。

享元模式的通用类图
public abstract class Flyweight {
  private String intrinsic;

  public String getIntrinsic() {
    return intrinsic;
  }

  public void setIntrinsic(String intrinsic) {
    this.intrinsic = intrinsic;
  }

  protected final String extrinsic;// final

  // 享元角色接受外部的状态
  public Flyweight(String _extrinsic) {
    // TODO Auto-generated constructor stub
    this.extrinsic = _extrinsic;
  }

  // 定义业务操作
  public abstract void operate();

}


public class ConcreteFlyweightOne extends Flyweight {

  public ConcreteFlyweightOne(String _extrinsic) {
    super(_extrinsic);
    // TODO Auto-generated constructor stub
  }

  @Override
  public void operate() {
    // TODO Auto-generated method stub

  }

}

public class ConcreteFlyweightTwo extends Flyweight {

  public ConcreteFlyweightTwo(String _extrinsic) {
    super(_extrinsic);
    // TODO Auto-generated constructor stub
  }

  @Override
  public void operate() {
    // TODO Auto-generated method stub

  }

}

/*
 * 创建享元对象工厂
 * */
public class FlyweightFactory {
  // 定义对象池
  private static HashMap<String, Flyweight> pool = new HashMap<>();

  // 享元工厂
  public static Flyweight getFlyweight(String extrinsic) {
    Flyweight flyweight = null;
    if (pool.containsKey(extrinsic)) {
        flyweight = pool.get(extrinsic);
    } else {
        // 创建享元对象,并放入pool中
        flyweight = new ConcreteFlyweightOne(extrinsic);
        pool.put(extrinsic, flyweight);
    }
    return flyweight;
  }
}
优点和缺点:
使用场景:
享元模式拓展
最佳实践:
public class Test {// api 中的享元模式
  public static void main(String[] args) {
    String str1 = "和谐";
    String str2 = "社会";
    String str3 = "和谐社会";
    String str4;
    str4 = str1 + str2;
    System.out.println(str4 == str3);
    str4 = (str1 + str2).intern();
    System.out.println(str4 == str3);
  }
}

>false
>true

虽然可以使用享元模式来实现对象池,但是二者还是有比较大的区别,对象池着重在对象的复用上,对象池中的每个对象都是可替换的,从对象池中取出的对象a、对象b对客户端来说是完全相同的,主要解决复用,而享元模式主要解决的是对象的共享问题,如何建立多个可共享的细粒度对象则是其关注的重点。

上一篇 下一篇

猜你喜欢

热点阅读