概念

  • 享元模式(Flyweight Pattern),运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。对象结构型
  • 在享元模式中可以共享的相同内容称为内部状态(IntrinsicState),而那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State),由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征,而相同的内部状态是可以共享的。
  • 在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池(Flyweight Pool)用于存储具有相同内部状态的享元对象。
  • image.png

主要角色

  • Flyweight: 抽象享元类 Connection
  • ConcreteFlyweight: 具体享元类 ConnectionImpl(user,pwd,url)
  • UnsharedConcreteFlyweight: 非共享具体享元类ConnectionImpl(state)
  • FlyweightFactory: 享元工厂类;简单工厂,产品就一个Connection ```java /**
    • 具体享元类 */ @AllArgsConstructor public class BeautifulWaitress extends AbstractWaitressFlyweight{ String id;//工号 String name;//名字 int age;//年龄 //以上是不变的
  1. @Override
  2. void service() {
  3. System.out.println("工号:"+id+";"+name+" "+age+" 正在为您服务...");
  4. //改变外部状态
  5. this.canService = false;
  6. }
  7. @Override
  8. void end() {
  9. System.out.println("工号:"+id+";"+name+" "+age+" 服务结束...请给五星好评");
  10. this.canService = true;
  11. }

}

  1. ```java
  2. /**
  3. * 足道店:这相当于享元工厂
  4. * 店里面很多服务员。
  5. *
  6. * 享元和原型
  7. * 1、享元返回的是这个本人。
  8. * 2、原型返回的是克隆人。
  9. * FlyweightFactory: 享元工厂类
  10. */
  11. public class ZuDao {
  12. private static Map<String,AbstractWaitressFlyweight> pool = new HashMap<>();
  13. //享元,池子中有对象
  14. static {
  15. BeautifulWaitress waitress =
  16. new BeautifulWaitress("1111","张三",18);
  17. BeautifulWaitress waitress2 =
  18. new BeautifulWaitress("9527","李四",20);
  19. pool.put(waitress.id,waitress);
  20. pool.put(waitress2.id,waitress2);
  21. }
  22. public void addWaitress(AbstractWaitressFlyweight waitressFlyweight){
  23. pool.put(UUID.randomUUID().toString(),waitressFlyweight);
  24. }
  25. public static AbstractWaitressFlyweight getWaitress(String name){
  26. AbstractWaitressFlyweight flyweight = pool.get(name);
  27. if(flyweight == null){
  28. for (AbstractWaitressFlyweight value : pool.values()) {
  29. //当前共享对象能否是否
  30. if(value.isCanService()){
  31. return value;
  32. }
  33. };
  34. return null;
  35. }
  36. return flyweight;
  37. }
  38. }

应用场景

  • 典型的代表:数据库连接池
  • 所有的池化技术
  • 享元和原型模式有什么区别?享元是预先准备好的对象进行复用,原型没法确定预先有哪些