简要说明
简要的理解:享元模式就是新建一个池(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); // trueSystem.out.println(s1 == s3); // falseSystem.out.println(s3 == s4); // falseSystem.out.println(s3.intern() == s1); // trueSystem.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;@Overridepublic String toString() {return "Bullet{" + "id=" + id + '}';}
}
二、源码地址
https://github.com/jxaufang168/Design-Patternshttps://github.com/jxaufang168/Design-Patterns