【设计模式-08】Flyweight享元模式

简要说明

简要的理解:享元模式就是新建一个池(Pool),该池子(Pool)中有新建好的一堆对象,当需要使用时,从池子(Pool)中直接获取,不用重新新建一个对象。通俗的讲就是:共享元数据

  • 比如Java中的String就是使用享元模式,String的值存储在一个内存池中,不用每次分配一个内存存储字符串的值。
  • 再比如:App客户端中TableView列表中的TableViewCell也是最经典的享元模式,一个TableView列表中的Cell是重复利用,最大限度的重复利用,以此保证整个列表流畅度。

结合组合模式(Composite)

如图中的紫色部分,可以作为一个组合进行共享使用,即结合了组合模式(Composite)的享元模式。

一、代码实现

1、Java String中的享元模式

/**
 * @description: Java String 中的享元模式
 * @author: flygo
 * @time: 2022/7/21 11:32
 */
public class TestString {

  public static void main(String[] args) {
    String s1 = "abc";
    String s2 = "abc";

    String s3 = new String("abc");
    String s4 = new String("abc");

    System.out.println(s1 == s2); // true
    System.out.println(s1 == s3); // false
    System.out.println(s3 == s4); // false
    System.out.println(s3.intern() == s1); // true
    System.out.println(s3.intern() == s4.intern()); // true
  }
}

2、对象池模拟Flyweight享元模式

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * @description: 对象池模拟Flyweight享元模式
 * @author: flygo
 * @time: 2022/7/21 11:37
 */
public class BulletPool {

  List<Bullet> bulletList = new ArrayList<>();

  {
    for (int i = 0; i < 5; i++) {
      bulletList.add(new Bullet());
    }
  }

  public Bullet getBullet() {
    for (int i = 0; i < bulletList.size(); i++) {
      Bullet b = bulletList.get(i);
      if (!b.living) {
        return b;
      }
    }
    return new Bullet();
  }

  public static void main(String[] args) {
    BulletPool bp = new BulletPool();

    for (int i = 0; i < 10; i++) {
      Bullet bullet = bp.getBullet();
      System.out.println(bullet);
    }
  }
}

class Bullet {
  public UUID id = UUID.randomUUID();
  boolean living = true;

  @Override
  public String toString() {
    return "Bullet{" + "id=" + id + '}';
  }
}

二、源码地址

https://github.com/jxaufang168/Design-Patternsicon-default.png?t=N7T8https://github.com/jxaufang168/Design-Patterns

相关推荐

  1. 设计模式-09 - 模式 flyweight pattern

    2024-01-21 05:36:02       31 阅读
  2. 设计模式--模式Flyweight Pattern)

    2024-01-21 05:36:02       41 阅读
  3. 设计模式】11、flyweight 模式

    2024-01-21 05:36:02       35 阅读
  4. 设计模式——模式Flyweight

    2024-01-21 05:36:02       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-21 05:36:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-21 05:36:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-21 05:36:02       87 阅读
  4. Python语言-面向对象

    2024-01-21 05:36:02       96 阅读

热门阅读

  1. 每日算法打卡:连号区间数 day 18

    2024-01-21 05:36:02       57 阅读
  2. K8s面试题——基础篇2

    2024-01-21 05:36:02       46 阅读
  3. golang二分查找算法实现

    2024-01-21 05:36:02       53 阅读
  4. vue3中的nexttick

    2024-01-21 05:36:02       60 阅读
  5. logstack 日志技术栈-03-日志最佳实践

    2024-01-21 05:36:02       47 阅读
  6. 《微信小程序开发从入门到实战》学习八十七

    2024-01-21 05:36:02       60 阅读
  7. 你们有没有发现,越来越多人卷嵌入式了?

    2024-01-21 05:36:02       59 阅读
  8. UVA10678 The Grazing Cow 题解a

    2024-01-21 05:36:02       53 阅读