定义: 享元模式是运用共享技术有效地支持大量细粒度的对象,是一种结构型模式,主要的作用是减少对象的创建,以及减少内存的占用和性能的提升。原理是对现有对象的重用,如果没有再进行创建。具体结构示意图如下
需要的角色:抽象享元对象(Flyweight): 提供定义对象外部状态和内部状态的接口具体享元对象(ConcreteFlyweight): 对抽象享元对象的实现, 现实具体细节享元工厂(FlyweightFactory):负责对享元对象的创建和存储池的管理。
使用场景:
1、需要大量类似的对象。
2、需要用到缓存池的场景。
优点:减少对象的创建,节省内存。
缺点:增加系统的复杂程度。
使用示例:
1.Java中的String数据类型。
实现案例:小时候玩的俄罗斯方块,俄罗斯方块S、Z、L、J、I、O、T这七种模块形状,玩一局游戏需要很多模块,这个实现就可以使用享元模式,最开始的时候创建不同形状的模块对象,并进行缓存,当后面需要的时候直接从缓存进行获取。
示例代码:抽象享元对象类:具体享元对象类:public interface AbsFlyweight { void showTetris(String shape); }
享元工厂类:public class Tetromino implements AbsFlyweight { private static final String TAG = "flyweight"; private String shape ; public Tetromino(){ Log.i(TAG, "Tetromino: 使用构造方法创建对象"); } public String getShape() { return shape; } public void setShape(String shape) { this.shape = shape; } @Override public void showTetris(String shape) { Log.i(TAG, "showTetris: 当前的模块形状是: " + shape); } }
测试代码:public class TetrominoFactory { private static final String TAG = "flyweight"; private static Map<String, Tetromino> tetrominoMap = new HashMap<>(); public static Tetromino getTetromino(String share){ Tetromino tetromino = null; if (tetrominoMap.containsKey(share)){ Log.i(TAG, "getTetromino: 从map容器中获取对象"); tetromino = tetrominoMap.get(share); }else { tetromino = new Tetromino(); tetromino.setShape(share); tetrominoMap.put(share, tetromino); } return tetromino; } }
测试结果:从测试输出结果我们可看出,第一次的时候是通过new创建对象的,后面都是从缓存中进行获取。private String[] shapes = {"S","Z","L","J","I","O","T"}; Tetromino tetromino ; for (int i = 0; i < 20; i++){ tetromino = TetrominoFactory.getTetromino(shapes[i % shapes.length]); }
设计模式之享元模式
最新推荐文章于 2024-10-16 22:07:21 发布